【问题标题】:How to split a list and save objects individually?如何拆分列表并单独保存对象?
【发布时间】:2016-06-18 04:08:55
【问题描述】:

我正在尝试向多个数据框添加一个新列,然后用新的数据框替换原始数据框。这就是我创建新数据框的方式:

df1 <- data.frame(X1=c(1,2,3),X2=c(1,2,3))
df2 <- data.frame(X1=c(4,5,6),X2=c(4,5,6))

groups <- list(df1,df2)
groups <- lapply(groups,function(x) cbind(x,X3=x[,1]+x[,2]))
groups

[[1]]
  X1 X2 X3
1  1  1  2
2  2  2  4
3  3  3  6

[[2]]
  X1 X2 X3
1  4  4  8
2  5  5 10
3  6  6 12

我对新数据框的创建方式感到满意。然后我坚持的是分解我的groups 列表,然后将列表元素保存回它们各自的原始数据框中。

期望的输出

基本上,我想做类似df1,df2 &lt;- groups[[1]],groups[[2]] 的事情,但这当然在语法上是无效的。我有超过 2 个数据框,这就是为什么我希望有一种更编程的方法,而不是简单地输入 N 行代码。

【问题讨论】:

  • 在列表中保持 data.frames 具有相同结构在 R 中通常是一个非常好的主意,因为您可以使用 lapply 和其他工具来处理它们。有关一些有用的提示,请参阅 gregor 在this question 上的回答。您还可以将名称添加到您的列表项以使其更易于访问:names(groups) &lt;- c("df1", "df2")
  • 谢谢你,这是一个非常有用的线程。我将尝试实施这种方法。如果有人仍然愿意回答,我仍然对我最初的问题感到好奇。

标签: r


【解决方案1】:
for (i in 1:length(groups)){
   assign(paste("df",i,sep=""),as.data.frame(groups[[i]]))
}

应该这样做。请尝试一下。

【讨论】:

  • 关闭。应该是for (i in 1:length(groups)){ assign(paste0("df",i),as.data.frame(groups[[i]])) }
  • 谢谢,您的帖子有助于指导我找到自己的答案。当数据框按顺序编号时,您的解决方案有效,但我将发布适用于任何命名约定的答案。
【解决方案2】:

@Rockbar 也让我找到了一个通用的解决方案:

for(i in 1:length(groups)){
  assign(names(groups)[i],as.data.frame(groups[[i]]))
}

> df1
  X1 X2 X3
1  1  1  2
2  2  2  4
3  3  3  6
> df2
  x1 X3 X3
1  4  4  8
2  5  5 10
3  6  6 12

我应该注意,这只有在列表中的对象都被命名时才有效。再次感谢 @Rockbar 为我提供的指导。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多