2016-03-29 59 views
3

我有这样一个data.table:矢量化:如何才能在向量矢量中只有所有元素集合的集合差异?

dt=data.table(freq=c(4,3,2,1),elements=list(c('a','b','c'), 
              c('a','d'), 
              c('b','d'), 
              c('b','d','c','e'))) 
    freq elements 
1: 4 a,b,c 
2: 3  a,d 
3: 2  b,d 
4: 1 b,d,c,e 

我需要每一行中的元素是只有该行的元素和该行之前的集合中的所有元素的关节之间的差集。这样一来,我会得到这样的:

freq elements 
1: 4 a,b,c 
2: 3  d 
3: 2  NA 
4: 1  e 

我可以与该组中的所有元素做到这一点,直到我-1,只得到差集,但我真的想知道如何做到这一点的矢量化的方式,如果可能的话。

谢谢你们!

+6

你怎么' e'在最后一行? – akrun

+0

另外,如果你有一个非矢量化的解决方案,它是什么? – Justin

+1

也许你可以找到每个元素和累积集合的集合差异?例如。 'Map(setdiff,dt $ elements,head(Reduce(union,dt $ elements,accumulate = TRUE,init = NULL),-1L))' –

回答

8

假设你的意思是有dt你的最后一排的一个“e”,那freq是唯一的(如果没有,创建唯一索引,或者用行):

dt[, .(els = elements[[1]]), by = freq][ 
    , .(freq = freq[1]), by = els][ 
    , .(filtered = list(els)), by = freq][ 
    dt, on = 'freq'] 
# freq filtered elements 
#1: 4 a,b,c a,b,c 
#2: 3  d  a,d 
#3: 2  NULL  b,d 
#4: 1  e b,d,e 
+0

谢谢Eddi,非常好的回答,我只是不明白你刚才写的算法的流程,你能帮我理解吗? –

+0

@AldoPareja尝试增量运行它(每次添加一组[] s) - 这个想法很简单 - 找到每个元素的第一个freq(上面的第二行) - 其余的只是按照您喜欢的格式重新排列它 – eddi

+0

哦,我现在明白了....非常感谢你! –