【问题标题】:Merge more than two lists in R在 R 中合并两个以上的列表
【发布时间】:2015-09-25 13:00:58
【问题描述】:

基本上,我想将多个列表合并到一个列表中。所有列表都具有相同的结构。这是一个例子:

file1=list(A=1,B=2)
file2=list(A=2,B=3)
file3=list(A=3,B=4)

我知道mapply()Map() 有效。

> mapply(c, file1, file2, file3, SIMPLIFY=FALSE)
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3 4

但问题是我实际上有 500 个列表,嗯,我可以肯定复制和粘贴对象名称 500 次。但是,我想学习如何有效地做到这一点。我有一个包含每个 500 个列表的名称的向量,就像这样,

lsNames=c("file1","file2","file3")

但我不知道如何开始,感谢任何帮助,谢谢。

【问题讨论】:

  • 你也可以使用mget(ls(pattern='file\\d+'))
  • 为什么这 500 个列表会出现在您的工作区中?从他们的创作开始,他们就应该在一个列表或环境中在一起。
  • @Roland 它们每个都是来自单个模拟的结果,我实际上可以一次运行 500 个模拟然后我会有一个我想要的列表,但是由于硬件限制,我只能运行一个模拟然后清理一些磁盘空间,所以我最终遇到了这种奇怪的情况
  • 我还是不明白。如果你运行 500 次模拟,我当然希望你能循环进行。但是我不明白你怎么能在你的工作区中结束 500 个单独的对象,而不是做类似res <- list(); for (i in seq_len(500) res[[i]] <- yourComputations 或(最好)使用replicatelapplyforeach
  • 如果模拟结果是一个向量或单个值,这会起作用,但我的是一个列表,所以你提供的代码会产生一个嵌套列表,它实际上离我想要的更近了一步,但它是与执行 mget() 相同,但这仍然不是我需要的

标签: r merge


【解决方案1】:

这是一种替代方法,它通过构造然后评估对 OP 中显示的 mapply() 的相同调用来工作:

do.call(mapply, c(FUN=c, sapply(lsNames, as.symbol), SIMPLIFY=FALSE))
# $A
# file1 file2 file3 
#     1     2     3 
# 
# $B
# file1 file2 file3 
#     2     3     4 

【讨论】:

  • 优雅,我猜 do.call 中有一个 eval?
  • 我实际上尝试过将as.symbol()mapply() 结合使用,但从未想过以这种方式使用do.call()。再次,非常感谢。
  • 如果有人关心,do.call(Map, c(f=c, sapply(lsNames, as.symbol))) 也可以使用
【解决方案2】:

我不确定这是否是您所追求的,但我已经编写了一段代码,可以将您从列表中转到一个 data.frame。

library(plyr)

file1 = list(A = 1, B = 2)
file2 = list(A = 2, B = 3)
file3 = list(A = 3, B = 4)

lsNames = c("file1", "file2", "file3")

# defining new list
my_list <- list()

# getting data from your objects file_1...file_n to new list
for(lsName in seq_along(lsNames)){

  my_list[[lsName]] <- unlist(get(lsNames[lsName]))
}

# list to data.frame
my_df <- 
  ldply(my_list)

my_final_df <- 
  cbind(my_df, lsNames) 

# a look at result
my_final_df

  A B lsNames
1 1 2   file1
2 2 3   file2
3 3 4   file3

【讨论】:

  • 这也可以,我需要计算A和B的sd()和mean(),data.frame确实有我需要的方便格式。非常感谢
猜你喜欢
  • 2012-03-20
  • 2020-10-16
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多