数据表列表中的连续setdiff

时间:2012-10-01 00:44:10

标签: 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 [[n + 1]]]中的行,其中 id 不存在于dtl [[n]]中。我认为它会像

dtl2 <- list(setdiff(dtl[[1]][['id']],dtl[[2]][['id']]),setdiff(dtl[[2]][['id']],dtl[[3]][['id']]...)

请注意,虽然setdiff应该只考虑 id 列,但我希望结果包含每个数据表中的所有列。

1 个答案:

答案 0 :(得分:3)

我认为这会为你做到:

mapply(setdiff, head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)

修改:使用新的预期输出,我仍然会使用上面的mapply,但使用以下两项更改之一:

  1. setdiff替换为function(x,y)setdiff(x$id, y$id)
  2. dtl替换为ids <- lapply(dtl, "[", "id")
  3. 编辑2::您通过添加与您提供的代码不符的简单英语说明再次更改了您的预期输出...我认为您是现在正在寻找:

    mapply(function(x,y)y[setdiff(y$id, x$id), ],
           head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)