【问题标题】:Extract then row.bind data.frames from nested lists然后从嵌套列表中提取 row.bind data.frames
【发布时间】:2017-02-26 05:09:55
【问题描述】:

我有一个函数可以输出一个大矩阵 (Mat1) 和一个小数据帧 (Smalldf1),我将它们存储在一个名为“Result”的列表中。 这个函数在一个循环中运行,所以我创建了许多版本的“结果”列表,直到我的循环结束......每次我将它们添加到一个名为“最终”的列表中。

在我的循环结束时,我最终得到一个名为 FINAL 的列表,其中包含许多较小的“结果”列表...每个包含一个小数据框和一个大矩阵。

我想将所有小数据帧合并在一起以形成一个更大的数据帧并将其称为 DF1 - 现在我正在访问列表中的列表,我不确定如何访问这些数据帧......?

这里的一个类似问题给出了这样的解决方案:

DF1 <- do.call("rbind",lapply(FINAL, function(x) x["Smalldf1"]))

但是,这将输出作为名为“Smalldf1”的单个列提供,并带有 Smalldf1 的描述...即,这实际上打印在列列表中(X1="xxx", X2="xxx", X3="xxx ")...我需要将其拆分为原始格式,包含信息的 3 列...?

任何帮助都会很棒。

【问题讨论】:

  • 请使用 dput() 提供一些示例数据
  • 出现错误 - lapply() RHS 中的错误似乎是函数名,但找不到
  • 是的 - 这就是我的数据的样子。在此数据上运行您的解决方案我收到此错误:错误:无法将对象转换为数据框。
  • 好的 - 它适用于第二个元素......它似乎适用于您的示例,但由于某种原因,我的代码出现错误“RHS 似乎是一个函数名称,但它找不到”...对不起,我知道你没有我的代码,我无法分享输出。
  • 请修改您的问题以包含此结果:str(head(FINAL, 2))

标签: r dataframe nested-lists rbind


【解决方案1】:

我将我的评论变成一个答案。这可能是您的数据:

df <- data.frame(X1=1:3, X2=4:6, X3=7:9)
FINAL=list(Result=list(Smalldf1=df, Mat1=as.matrix(df)),
             Result=list(Smalldf1=df+1, Mat1=as.matrix(df+1)))

您可以结合lapply 来提取嵌套列表的第一个(或第N 个,只需更改1)元素,然后使用do.call 或使用dplyr 对此结果执行rbind:

#### # Doing it in base R:
do.call("rbind", lapply(FINAL, "[[", 1) )
#### # Or doing it with dplyr:
library(dplyr)
lapply(FINAL, "[[", 1) %>% bind_rows
####   X1 X2 X3
#### 1  1  4  7
#### 2  2  5  8
#### 3  3  6  9
#### 4  2  5  8
#### 5  3  6  9
#### 6  4  7 10

这应该是您的预期结果

警告: 使用dplyr 的解决方案不适用于旧版本的 dplyr(我在 dplyr_0.5.0 上测试过,但它在 dplyr_0.2 上返回错误)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2017-06-10
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多