data.table list .N(count)完全删除行而不是计算0计数

时间:2015-11-26 00:07:28

标签: r list count data.table

说我有这个data.table:

df <- data.frame(ID = c("A","A","A","A","B","B","B","B"),
                 Flag = c(1,1,1,1,0,0,0,1))
df <- data.table(df)

df
   ID Flag
1:  A    1
2:  A    1
3:  A    1
4:  A    1
5:  B    0
6:  B    0
7:  B    0
8:  B    1

我希望计算每个ID的0和1标志的数量,如下:

Summary <- df[, list(Count = .N), by = c("ID","Flag")]

这会返回以下结果:

Summary
   ID Flag Count
1:  A    1     4
2:  B    0     3
3:  B    1     1

因此,由于ID A没有记录0,所以没有列出ID A和Flag 0组合的行,计数为零。

使用data.table进行此操作的方法是什么?

I.e ..我想实现这个结果:

Summary
  ID Flag Count
1  A    0     0
2  A    1     4
3  B    0     3
4  B    1     1

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以将列分解,然后制表。由于我们知道我们只需要0和1级别,因此我们可以将0:1用于Flag列,而无需将Flag列实际指定为一个因素。虽然这种方法会比较慢(见第二部分)。

df[, .(Flag = 0:1, Count = tabulate(factor(Flag, levels = 0:1))), by = ID]
#    ID Flag Count
# 1:  A    0     0
# 2:  A    1     4
# 3:  B    0     3
# 4:  B    1     1

正如评论中的thelatemail注释,更快的方法是先将整个列分解,然后根据ID制表。

df[, Flag := factor(Flag, levels = 0:1)]
df[, .(Flag = levels(Flag), Count = tabulate(Flag)), by = ID]
#    ID Flag Count
# 1:  A    0     0
# 2:  A    1     4
# 3:  B    0     3
# 4:  B    1     1