我想按组对我的数据集中的冲突数量进行计数。我觉得在data.table中肯定有一种简单的方法来做到这一点,但似乎无法弄清楚。我已经创建了一个虚拟变量,以告诉我数据表的每一行是否存在冲突。
testDT <- data.table(Name = c(rep('A',6),rep('B',5)),
Division = c(rep(11,6),rep(12,5)),
ID = c(205,205,NA,201,201,201,203,203,203,204,NA),
Conflict = c(0,0,0,1,1,1,1,1,1,1,0))
我需要统计每个名字和部门组合中,具有冲突标志为1的非NA ID 的独立数量,并将该数量应用于新列中。答案如下:
testDT[, Count := c(rep(1,6),rep(2,5))]
Name Division ID Conflict Count
1: A 11 205 0 1
2: A 11 205 0 1
3: A 11 NA 0 1
4: A 11 201 1 1
5: A 11 201 1 1
6: A 11 201 1 1
7: B 12 203 1 2
8: B 12 203 1 2
9: B 12 203 1 2
10: B 12 204 1 2
11: B 12 NA 0 2
我一直在考虑使用sum(!is.na(unique(ID)))
的一些用法,但我不确定如何有条件地计算唯一值而不在数据表的i部分创建条件(Conflict == 1)
。
j
中要加入条件?我想这会使速度变慢。testDT[!is.na(ID) & Conflict == 1, Count := uniqueN(ID), by = .(Name, Division)]
在整个表上执行所有逻辑测试,而不是在每个组上进行测试。除非我漏掉了什么。 - MichaelChiricouniqueN
有一个na.rm
参数,所以你可以使用它来代替在!is.na
上进行条件判断。根据你使用的版本,这可能会导致错误,不过我已经更新了才解决了这个问题(https://github.com/Rdatatable/data.table/issues/1771)。 - Frank