说我有这个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
谢谢!
答案 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