r - data.table "list"与 ":="处理 NaN

标签 r data.table

注意到 data.table 的一些奇怪行为,希望有人比我能解释的更了解 data.table。

说我有这个 data.table:

library(data.table)
DT <- data.table(
  C1 = c(rep("A", 4), rep("B",4), rep("C", 4)),
  C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)),
  Val = c(1:5, NaN, NaN, 8,9,10,NaN,12))

DT
    C1 C2 Val
 1:  A  a   1
 2:  A  a   2
 3:  A  a   3
 4:  A  b   4
 5:  B  b   5
 6:  B  b NaN
 7:  B  c NaN
 8:  B  c   8
 9:  C  c   9
10:  C  d  10
11:  C  d NaN
12:  C  d  12

现在,在我看来,以下两种方法应该会产生相同的结果,但事实并非如此。
TEST1 <- DT[, agg := min(Val, na.rm = TRUE), by = c('C1', 'C2')]
TEST1 <- data.table(unique(TEST1[, c('C1','C2','agg'), with = FALSE]))

TEST2 <- DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')]

TEST1
   C1 C2 agg
1:  A  a   1
2:  A  b   4
3:  B  b   5
4:  B  c   8
5:  C  c   9
6:  C  d  10


TEST2
   C1 C2 agg
1:  A  a   1
2:  A  b   4
3:  B  b   5
4:  B  c NaN
5:  C  c   9
6:  C  d  10

如您所见,使用“:=”生成的 (C1 = B, C2 = c) 的最小值为 8。而 list 命令会生成 NaN。
有趣的是,对于也有 NaN 的 (C1 = B,C2 = b) 和 (C1 = C, C2 = d),list 命令确实会产生一个值。
我相信这是因为在给定 C1 C2 组合的值之前先是 NaN 的情况下,结果是 NaN。而在其他两个示例中,NaN 位于值之后。

为什么会出现这种情况?

我注意到,如果 NaN 被 NA 替换,那么生成的值没有问题。

最佳答案

修复了这个问题,#1461刚刚在开发中,v1.9.7 带有 commit 2080 .

require(data.table) # v1.9.7, commit 2080+
DT <- data.table(
     C1 = c(rep("A", 4), rep("B",4), rep("C", 4)),
     C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)),
     Val = c(1:5, NaN, NaN, 8,9,10,NaN,12))

DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')]
#    C1 C2 agg
# 1:  A  a   1
# 2:  A  b   4
# 3:  B  b   5
# 4:  B  c   8
# 5:  C  c   9
# 6:  C  d  10

关于r - data.table "list"与 ":="处理 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34081848/

相关文章:

r - 使用 data.table 函数 foverlaps 查找两个表中重叠范围的交集

R Shiny 交互式地选择变量来执行计算

r - set.seed(n) 和 set.seed(n+1) 之间的真正区别是什么

r - 如何在运行时 Shiny 的 rmarkdown html_notebook 中使用 renderPlot 布局 2 行,然后是 1 列

将逻辑值 (TRUE/FALSE) 替换为数字 (1/0)

r - 在 R 函数内使用 data.table 的最佳方法是什么?

r - 如何使用ggplot绘制色轮?

r - 文本分析: What after term-document matrix?

r - 如果所有指定的列都匹配一个条件,则对 data.table 中的行进行子集

r - 按组检查是否存在基于其他列的先前条目