【问题标题】:Different data.table r results with or without quotations / How to count unique values with uniqueN带或不带引号的不同data.table r结果/如何使用uniqueN计算唯一值
【发布时间】:2016-10-19 19:47:17
【问题描述】:

我正在尝试选择值为 7015061009422 的所有声明 (ICN)。我使用以下代码:

  dt[ICN==7015061009422]

我回来了

> dt[ICN==7015061009422]
    UniversalID           ICN
 1:           2 7015061009422
 2:           3 7015061009417
 3:           2 7015061009411
 4:           2 7015061009428
 5:           2 7015061009437
 6:           4 7015061009417
 7:           5 7015061009411
 8:           6 7015061009417
 9:           6 7015061009422
10:           7 7015061009422

我终于想通了,如果我在值周围加上引号,我想要发生的事情,就是选择所有实际 ICN 编号等于 7015061009422 的行,这就是我得到的:

    > dt[ICN=="7015061009422"]
   UniversalID           ICN
1:           2 7015061009422
2:           6 7015061009422
3:           7 7015061009422

为什么在我的数据值周围使用引号会产生如此大的差异?

样本数据集:

    ICN<-c(7015061009422,7015061009417,7015061009411,7015061009428,7015061009437,7,7015061009417,7015061009411,7015061009417,7015061009422,7015061009422,1)
  UniversalID<-c(2,3,2,2,2,1,4,5,6,6,7,8)
  dt<-cbind(UniversalID,ICN)
  dt<-as.data.table(dt)
  dt[ICN==7015061009422]
  dt[ICN=="7015061009422"]

我希望这也可以帮助我弄清楚为什么我的唯一计数不起作用:

> > dt[,uniqueN(ICN)] 
[1] 3

很明显,有不止三个不同的 ICN 值,为什么会这样呢?

【问题讨论】:

  • 问题与this Q 相同。阅读?setNumericRounding。执行setNumericRounding(0L),您的第一个命令应该与第二个命令的值相同。
  • PS:对于大整数使用bit64::integer64(而不是double)。

标签: r syntax data.table unique


【解决方案1】:

当您使用== 比较非常大的数字时,R 不会检查是否完全相等。相反,它检查数字是否彼此“接近”。如果是,则返回 TRUE。 R 对浮点数做同样的事情。

当你在你的号码周围加上引号时,你是在隐式地将它转换成一个字符串。因此,调用== 会导致 R 进行字符串比较,然后你就会得到你想要的答案。

使用abs(a-b) &lt; 0.001 或其他任意小数字代替a == b

编辑:您是否对这些数字进行任何实际算术运算?如果不是,您可能应该将它们转换为因子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多