[英]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.