【问题标题】:consecutive setdiff in datatable list数据表列表中的连续 setdiff
【发布时间】:2012-10-01 00:44:09
【问题描述】:

使用组织为的数据

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 列,但我希望结果包含每个数据表中的所有列。

【问题讨论】:

    标签: r list data.table set-difference


    【解决方案1】:

    我认为这会为您解决问题:

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

    编辑:对于您的新预期输出,我仍会使用上述mapply,但需要进行以下两个更改之一:

    1. setdiff 替换为function(x,y)setdiff(x$id, y$id)
    2. dtl 替换为ids &lt;- lapply(dtl, "[", "id")

    Edit2::您通过添加与您提供的代码不匹配的简单英文描述再次更改了预期输出......我认为你是现在正在寻找这个:

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

    【讨论】:

    • 尾部/头部解决方案非常巧妙。但在运行此语句后,我仍然在连续的 data.tables 中获得相同的 ID :(
    • @dmvianna 听起来您可能对setdiff 所做的事情感到困惑(在具有多列的数据表上),并且需要更具体地了解您想要的输出。
    • 嗯。 @dmvianna,我相当肯定我的输出与您预期的 dtl2 相同(如您的问题中当前定义的那样)。你能复习吗?
    • @joran,你们两个是对的,我没有表达清楚。我更改了结果语句以更好地描述我正在寻找的内容。
    • @dmvianna 您只需将setdiff 替换为基本上执行此操作的自定义函数:setdiff(dtl[[1]][['id']],dtl[[2]][['id']])。我确信 flodel 会相应地进行编辑...
    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2016-08-26
    • 2019-05-05
    相关资源
    最近更新 更多