R 数据表列表中的连续setdiff
将数据组织为R 数据表列表中的连续setdiff,r,list,data.table,set-difference,R,List,Data.table,Set Difference,将数据组织为 dtl <- replicate(10,data.table(id=sample(letters,10),val=sample(10)), simplify=F) lapply(dtl, function(x){setkey(x,'id')}) dtl我想这可以帮你做到: mapply(setdiff, head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE) 编辑:对于新的预期输出,我仍然会使用上面提到的mapply,但有以下两个更
dtl <- replicate(10,data.table(id=sample(letters,10),val=sample(10)), simplify=F)
lapply(dtl, function(x){setkey(x,'id')})
dtl我想这可以帮你做到:
mapply(setdiff, head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)
编辑:对于新的预期输出,我仍然会使用上面提到的mapply
,但有以下两个更改之一:
将setdiff
替换为函数(x,y)setdiff(x$id,y$id)
用ids替换dtl
。尾部/头部解决方案非常巧妙。但是在运行此语句之后,我仍然在连续的data.tables中获得相同的ID:(@dmvianna听起来您可能对setdiff
的作用感到困惑(在具有多列的数据表上),并且需要更具体地说明您想要的输出。嗯。@dmvianna,我相当肯定我的输出与您期望的dtl2
(如您问题中当前的定义)是相同的。你能回顾一下吗?@joran,你们两个是对的,我没有清楚地表达自己的意思。我更改了结果语句,以便更好地描述我所寻找的内容。@dmvianna你只需要用一个基本上可以这样做的自定义函数替换setdiff:setdiff(dtl[[1][[id']],dtl[[2][[id']])
。我相信flodel会相应地进行编辑。。。
mapply(setdiff, head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)
mapply(function(x,y)y[setdiff(y$id, x$id), ],
head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)