R 向量化:在向量的向量中,我怎么能只得到之前所有元素集合的集合差?
我有一个data.table,如下所示:R 向量化:在向量的向量中,我怎么能只得到之前所有元素集合的集合差?,r,data.table,vectorization,R,Data.table,Vectorization,我有一个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'
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
我可以用a来做这件事,它将所有元素分组到I-1,只得到集合差,但我真的很想知道如何以矢量化的方式来做,如果可能的话
谢谢你们 假设您打算在
dt
的最后一行中有一个“e”,并且freq
是唯一的(如果不是,请创建一个唯一的索引,或使用行):
您是如何在最后一行得到
e
的?另外,如果您有一个非矢量化的解决方案,它是什么?也许您可以找到每个元素和累积集合并集的集合差?例如,Map(setdiff,dt$elements,head(Reduce(union,dt$elements,acculate=TRUE,init=NULL),-1L))
@alexis您可以将其作为答案发布。我认为这是一个好方法。抱歉,伙计们已经修复了丢失的“e”谢谢Eddi,回答得很好,我只是不理解你刚刚编写的算法的流程,你能帮我理解吗?@AldoPareja尝试递增运行它(一次添加一组[]s)-想法很简单-为每个元素找到第一个频率(上面第二行)-其余的只是以您喜欢的格式重新排列它-非常干净的方法。关于使用\n][而不是][\n格式化链的想法?我的编辑器只会正确地自动缩进前者。@Clayton Stanley tbh我真希望有一种方法可以做到]\n[。我还不确定“最佳”语法是什么。
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