r - 将数据框列表转换为具有列表名称的单个数据框

标签 r list dataframe sapply

我希望找到一种有效的方法将数据帧列表转换为单个数据帧。以下是我可重现的 MWE:

set.seed(1)
ABAge = runif(100)
ABPoints = rnorm(100)
ACAge = runif(100)
ACPoints = rnorm(100)
BCAge = runif(100)
BCPoints = rnorm(100)

A_B <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = ABAge, Points = ABPoints)
A_C <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = ACAge, Points = ACPoints)
B_C <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = BCAge, Points = BCPoints)
A_B$ID <- as.character(A_B$ID)
A_C$ID <- as.character(A_C$ID)
B_C$ID <- as.character(B_C$ID)

listFormat <- list("A_B" = A_B, "A_C" = A_C, "B_C" = B_C)

dfFormat <- data.frame(ID = as.character(paste0("ID", 1:100)), A_B.Age = ABAge, A_B.Points = ABPoints, A_C.Age = ACAge, A_C.Points = ACPoints, B_C.Age = BCAge, B_C.Points = BCPoints)
dfFormat$ID = as.character(dfFormat$ID)

这会产生如下所示的数据帧格式 ( dfFormat ):

'data.frame':   100 obs. of  7 variables:
 $ ID        : chr  "ID1" "ID2" "ID3" "ID4" ...
 $ A_B.Age   : num  0.266 0.372 0.573 0.908 0.202 ...
 $ A_B.Points: num  0.398 -0.612 0.341 -1.129 1.433 ...
 $ A_C.Age   : num  0.6737 0.0949 0.4926 0.4616 0.3752 ...
 $ A_C.Points: num  0.409 1.689 1.587 -0.331 -2.285 ...
 $ B_C.Age   : num  0.814 0.929 0.147 0.75 0.976 ...
 $ B_C.Points: num  1.474 0.677 0.38 -0.193 1.578 ...

和数据框列表 listFormat看起来像这样:

List of 3
 $ A_B:'data.frame':    100 obs. of  3 variables:
  ..$ ID    : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
  ..$ Age   : num [1:100] 0.266 0.372 0.573 0.908 0.202 ...
  ..$ Points: num [1:100] 0.398 -0.612 0.341 -1.129 1.433 ...
 $ A_C:'data.frame':    100 obs. of  3 variables:
  ..$ ID    : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
  ..$ Age   : num [1:100] 0.6737 0.0949 0.4926 0.4616 0.3752 ...
  ..$ Points: num [1:100] 0.409 1.689 1.587 -0.331 -2.285 ...
 $ B_C:'data.frame':    100 obs. of  3 variables:
  ..$ ID    : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
  ..$ Age   : num [1:100] 0.814 0.929 0.147 0.75 0.976 ...
  ..$ Points: num [1:100] 1.474 0.677 0.38 -0.193 1.578 ...

我希望能想出一种自动方法来转换 dfFormatlistFormat 。从上面的对象中可以看出,有两个主要条件:

1) 如果 listFormat 的每个子列表中都有公共(public)列(名称和内容) (在这些示例中 ID ),那么它们不会在输出的 dfFormat 中重复。 (在此示例中,它有最后一个 ID 列),

2) listFormat 子列表中的其余列名称成为 dfFormat 中的列并且其名称保留其子列表名称(即“A_B”),后跟一个点,然后是其原始列名称(即年龄),以便它在 dfFormat 中变为(即“A_B.Age”) 。

我尝试过各种unlist()sapply代码,但迄今为止尚未成功。实现这一目标的有效方法是什么?

最佳答案

您正在寻找dplyr::bind_rows:

library(dplyr)    
bind_rows(listFormat, .id = "name")

输出:

  name  ID       Age     Points
1  A_B ID1 0.2655087  0.3981059
2  A_B ID2 0.3721239 -0.6120264
3  A_B ID3 0.5728534  0.3411197
4  A_B ID4 0.9082078 -1.1293631
5  A_B ID5 0.2016819  1.4330237
6  A_B ID6 0.8983897  1.9803999

关于r - 将数据框列表转换为具有列表名称的单个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248706/

相关文章:

python - 如何从Python中的2D列表中获取最大x和最小y坐标?

python - 根据条件删除 Pandas Dataframe 中的前几行

r - 提取一列中具有满足另一列中给定条件的重复条目的行

python - 在 python 中使用 any 函数时,有没有办法查看找到了哪个列表项?

r - 减少EPS格式的地 block 大小

c# - 将 2 个列表与 foreach 循环进行比较,并根据未找到的项目创建新列表

python - 如何划分两个DataFrame

python - 将索引连同列值从一个数据帧插入到另一个数据帧

r - 如何在 geom_text 中使用上标?

R:当我用测试数据预测时作为新水平的因素