重新生成data.frame对输入列表的尊重

时间:2017-01-28 17:22:34

标签: r dataframe

我将inputList提供给我的自定义函数,在几个工作流程(几个简单的过滤)后,我最终得到data.frame resultDF,需要重新启动。我使用relist使resultDF具有与inputList相同的结构,但我收到了错误。有没有最简单的方法来重新resultDF?谁能指出我如何实现这一目标?任何的想法?抱歉这个简单的问题。

以下是列表中的输入data.frame:

inputList <- list(
    bar=data.frame(from=c(8,18,33,53),
                   to=c(14,21,39,61), val=c(48,7,10,8)),
    cat=data.frame(from=c(6,15,20,44), 
                   to=c(10,17,34,51), val=c(54,21,14,12)),
    foo=data.frame(from=c(11,43), to=c(36,49), val=c(49,13)))

在几个工作流程之后,我最终得到了这个data.frame:

resultDF <- data.frame(
    from=c(53,8,6,15,11,44,43,44,43),
    to=c(61,14,10,17,36,51,49,51,49),
    val=c(8,48,54,21,49,12,13,12,13)
)

我需要使用resultDF的相同结构重新inputList。我使用了relit方法,但是我收到了错误。

这是我想要的清单:

desiredList <- list(
    bar=data.frame(from=c(8,53), to=c(14,61), val=c(48,8)),
    cat=data.frame(from=c(6,15,44,44), to=c(10,17,51,51), val=c(54,21,12,12)),
    foo=data.frame(from=c(11,43,43), to=c(36,49,49), val=c(49,13,13))
)

如何实现desiredList?在此先感谢:)

1 个答案:

答案 0 :(得分:2)

我们可以遍历&#39; inputList&#39;并检查&#39; resultDF&#39;中的paste d行元素是%in% list个元素,并使用该索引来对结果进行子集化&#39;

lapply(inputList, function(x) resultDF[do.call(paste, resultDF) %in% do.call(paste, x),])

另一个选项是join,然后是split。我们rbind输入列表&#39;到data.table添加一栏&#39; grp&#39;使用&#39; resultDF&#39;指定list名称,join on&#39; resultDF&#39;的列名称,最后split数据集使用了&#39; grp&#39;专栏

library(data.table)
dt <- rbindlist(inputList, idcol = "grp")[resultDF, on = names(resultDF)]
split(dt[,-1, with = FALSE], dt$grp)