【问题标题】:How to combine data.frame object in multiple list efficiently without duplication?如何有效地在多个列表中组合 data.frame 对象而不重复?
【发布时间】:2017-02-16 15:08:49
【问题描述】:

我在多个存在重复的列表中有 data.frame 对象。但是,我打算将这些 data.frame 对象组合成一个列表而不重复。我尝试了几种方法来获得预期的输出,但无法弄清楚如何在多个列表中组合 data.frame 对象。因为在每个列表中,data.frame 对象的顺序非常不同。有谁知道轻松进行这种操作的任何技巧?怎样才能做到这一点?任何想法 ?提前致谢。

这是一个快速可重现的运行示例:

小例子:

myList_1 <- list(
  foo = data.frame(from=c(2,7,11,19), to=c(5,10,14,24), label=c("a1","a3","a5","a8"), score=c(2,5,8,12)),
  bar = data.frame(fom=c(12,17,21), to=c(15,19,25),label=c("b2","b3","b5"), score=c(7,3,6)),
  cat = data.frame(from=c(3,9,17,27), to=c(5,13,21,42),lable=c("c1","c3","c6", "c11"), score=c(5,2,4,9))
)

myList_2 <- list(
  bar = data.frame(from=c(7,12,27), to=c(10,15,36),label=c("b1","b2","b7"), score=c(4,7,11)),
  foo = data.frame(from=c(19,31,48), to=c(24,37,59),label=c("a8","a10","a15"), score=c(12,3,7)),
  cat = data.frame(from=c(6,17,22,27), to=c(12,21,25,42),label=c("c2","c6","c7","c11"), score=c(3,6,1,9))
)

myList_3 <- list(
  cat = data.frame(from=c(17,22, 45), to=c(21,25,58),label=c("c6","c7","c17"), score=c(4,1,5)),
  foo = data.frame(from=c(11,19,31,63), to=c(14, 24,37,71),label=c("a5","a8","a10","a19"), score=c(8,12,3,5)),
  bar = data.frame(from=c(27,57,72), to=c(36,66,83),label=c("b7","b14","b22"), score=c(11,2,8))
)

我想要的输出:

myList <- list(
  foo = data.frame(from=c(2,7,11,19,31,48,63),to=c(5,10,14,24,37,59,71),
                   label=c("a1","a3","a5","a8","a10","a15","a19"), score=c(2,5,8,12,3,7,5)),
  bar = data.frame(from=c(7,12,17,21,27,57,72),to=c(10,15,19,25,36,66,83),
                   label=c("b1","b2","b3","b5","b7","b14","b22"), score=c(4,7,3,6,11,2,8)),
  cat = data.frame(from=c(3,6,9,17,22,27,45),to=c(5,12,13,21,25,42,58),
                   label=c("c1","c2","c3","c6","c7","c11","c17"), score=c(5,3,2,4,1,9,5))
)

如何更轻松/更有效地获得输出?我怎样才能达到我想要的输出?非常感谢

【问题讨论】:

  • 我觉得有错字?在您的输入数据集中使用lable 而不是label

标签: r list dataframe


【解决方案1】:

我们可以通过Map 做到这一点。获取第一个列表 ('myList_1') 的 names 并使用它来对其他列表元素进行子集化,使其顺序相同。然后我们rbind对应每个list元素的data.frames和Map

nm1 <- names(myList_1)
Map(rbind, myList_1, myList_2[nm1], myList_3[nm1])

【讨论】:

  • @Andy.Jian 来自base R。我在您的输入数据集中的列名中发现了一些拼写错误。是有意还是无意
  • @Andy.Jian 名称顺序不同,通过子集更正。使用myList_2[nm1],但我说的是fom而不是fromlable而不是label
  • @Andy.Jian 你可以用map 代替Mappurrr,但是我没有发现太多优势
  • @Andy.Jian 你可以通过nm1 &lt;- sort(names(myList_1))来做这个
  • @Andy.Jian 你的数据集有问题,也许试试Map(function(x,y,z) unique(rbind(x,y,z)), myList_1, my_List_2[nm1], myList_3[nm1])
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多