2014-12-16 2 views
6

Я хочу иметь пересечение всех групп таблицы данных. Так что для приведенных данных:R data.table пересечение всех групп

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

Я хочу, чтобы иметь результат:

2 

Я знаю, что

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

даст мне желаемого результата, но я не разобрался, как создать список групп запроса data.table.

ответ

5

Я хотел бы попробовать использовать Reduce следующим образом (при условии, dt ваши данные)

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

Мне это нравится. Это проще, проще понять и определенно больше соответствовать подходу, который использует OP. –

2

Вот один из подходов.

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

И вот некоторые пояснительные комментарии.

## 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 

Если этот код и комментарии не ясны сами по себе, быстрый взгляд на следующее может помочь. В принципе, приведенный выше подход просто ищет и сообщает значение a для групп, которые возвращают x,y,z в колонке V1 ниже.

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

Up-голосование, но логика остается непрозрачным для меня. –

+0

@BondedDust - ОК, добавлено некоторое объяснение. –

Смежные вопросы