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)