簡體   English   中英

R data.table中的條件唯一計數

[英]Conditional Unique Counting in 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))

我需要計算沖突標志為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)))但我不知道如何有條件地算唯一值,而不在data.table的我部分創建標准(Conflict == 1)

您可以根據data.table []的條件對ID變量進行子集化,然后計算唯一值:

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

或遵循您的邏輯:

testDT[, Count := sum(!is.na(unique(ID[Conflict == 1]))), by=.(Name, Division)]

這是dplyr的選項

library(dplyr)
testDT %>%
    group_by(Name, Division) %>% 
    mutate(Count = n_distinct(ID[!is.na(ID) & Conflict==1]))
#    Name Division    ID Conflict Count
#   <chr>    <dbl> <dbl>    <dbl> <int>
#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM