我想按组计算数据集中的冲突数.我觉得在data.table中有一个简单的方法可以做到这一点,但似乎无法弄明白.我已经创建了一个虚拟变量来告诉我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))
Run Code Online (Sandbox Code Playgroud)
我需要计算冲突标志为1的非NA ID的唯一数量,并将新计数中的该计数应用于每个Name-Division分组.答案应该是这样的:
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
Run Code Online (Sandbox Code Playgroud)
我一直在考虑一些用法sum(!is.na(unique(ID))),但我不确定如何在不在data.table的i部分创建标准的情况下有条件地计算唯一值(Conflict == 1).
您可以ID通过data.table中的条件对变量进行子集化[],然后计算唯一值:
library(data.table)
testDT[, Count := uniqueN(ID[!is.na(ID) & Conflict == 1]), by=.(Name, Division)]
testDT
# 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
Run Code Online (Sandbox Code Playgroud)
或者遵循你的逻辑:
testDT[, Count := sum(!is.na(unique(ID[Conflict == 1]))), by=.(Name, Division)]
Run Code Online (Sandbox Code Playgroud)