2014-12-16 30 views
6

Tôi muốn có giao điểm của tất cả các nhóm của bảng dữ liệu. Vì vậy, đối với dữ liệu đưa ra:R data.table intersection của tất cả các nhóm

data.table(a=c(1,2,3, 2, 3,2), myGroup=c("x","x","x", "y", "z","z")) 

Tôi muốn có kết quả:

2 

Tôi biết rằng

Reduce(intersect, list(c(1,2,3), c(2), c(3,2))) 

sẽ cho tôi những kết quả mong muốn nhưng tôi không tìm ra cách tạo danh sách các nhóm truy vấn data.table.

Trả lời

5

tôi sẽ cố gắng sử dụng Reduce theo cách sau (giả sử dt là dữ liệu của bạn)

Reduce(intersect, dt[, .(list(unique(a))), myGroup]$V1) 
## [1] 2 
+1

Tôi thích nó. Nó đơn giản, dễ hiểu và chắc chắn hơn phù hợp với cách tiếp cận mà OP đang sử dụng. –

2

Đây là một cách tiếp cận.

nGroups <- length(unique(dt[,myGroup])) 
dt[, if(length(unique(myGroup))==nGroups) .BY else NULL, by="a"][[1]] 
# [1] 2 

Và đây là một số nhận xét giải thích.

## Mark down the number of groups in your data set 
nGroups <- length(unique(dt[,myGroup])) 
## Then, use `by="a"` to examine in turn subsets formed by each value of "a". 
## For subsets having the full complement of groups 
## (i.e. those for which `length(unique(myGroup))==nGroups)`, 
## return the value of "a" (stored in .BY). 
## For the other subsets, return NULL. 
dt[, if(length(unique(myGroup))==nGroups) .BY else NULL, by="a"][[1]] 
# [1] 2 

Nếu mã đó và nhận xét không rõ ràng, xem nhanh những điều sau đây có thể hữu ích. Về cơ bản, cách tiếp cận ở trên chỉ tìm kiếm và báo cáo giá trị a cho những nhóm trả lại x,y,z trong cột V1 bên dưới.

dt[,list(list(unique(myGroup))), by="a"] 
# a V1 
# 1: 1  x 
# 2: 2 x,y,z 
# 3: 3 x,z 
+0

Up-bình chọn nhưng logic vẫn khá mơ hồ với tôi. –

+0

@BondedDust - OK, đã thêm một số giải thích. –

Các vấn đề liên quan