R data.table中的条件唯一计数

shu*_*hes 2 r data.table

我想按组计算数据集中的冲突数.我觉得在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).

Psi*_*dom 6

您可以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)