【问题标题】:Storing integer value in a variable gives different value在变量中存储整数值会给出不同的值
【发布时间】:2016-01-01 05:04:16
【问题描述】:

我有一个整数类型的变量,它的值是 1/1

> typeof(res[3,"V2.review/helpfulness"])
[1] "integer"
> res[3,"V2.review/helpfulness"]
[1]  1/1

现在,当我将其存储或转换为整数时,我希望将值作为 1 和 1 的除法,即 1 例如,如果我有 2/3,我希望值为 0.6666 但它给了我结果

> as.integer(res[3,"V2.review/helpfulness"])
[1] 6
> as.double(res[3,"V2.review/helpfulness"])
[1] 6

有人可以提出解决方案吗?

【问题讨论】:

  • 你能展示一些你的数据吗?您可以将dput(head(res)) 的输出复制粘贴到您的问题中。
  • 这是一个非常大的数据
  • @Heroka 你能具体说说你想知道什么

标签: r type-conversion variable-assignment


【解决方案1】:

不,你在看一个因子,而不是一个整数:

DF = data.frame(x = c("1/1","2/3"))
typeof(DF$x) # "integer"
class(DF$x)  # "factor"

了解存储类型(typeof)并不重要。我建议通读 R 语言定义的前几节,以了解 R 的类和其他将它与您以前可能使用过的语言区分开来的怪癖。要到达那里,请输入 help.start() 并单击“R 语言定义”。


从文件中读取,R 将字符串转换为用于分类变量的因子。它不会计算您在那里的算术表达式(1/12/3),也没有任何分数类,只有整数、复数和浮点数。

如果要精确存储分数,请将分子和分母分开存储:

library(data.table)
DF[,c("num","den")] <- tstrsplit(as.character(DF$x), "/", type.convert = TRUE)

DF
#     x num den
# 1 1/1   1   1
# 2 2/3   2   3

现在要评估分数,您可以使用

DF$xnum <- DF$num/DF$den # obviously not an integer

DF
#     x num den      xnum
# 1 1/1   1   1 1.0000000
# 2 2/3   2   3 0.6666667

要查看所有列的类,请使用

sapply(DF, class)
#         x       num       den      xnum 
#  "factor" "integer" "integer" "numeric" 

评估分数的快捷方式是 DF$xnum &lt;- sapply(as.character(DF$x), function(z) eval(parse(text=z))),但通常强烈建议不要使用这种 hack。

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2022-01-22
    • 2014-04-26
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多