我希望找到一种有效的方法将数据帧列表转换为单个数据帧。以下是我可重现的 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 ...
我希望能想出一种自动方法来转换 dfFormat
至listFormat
。从上面的对象中可以看出,有两个主要条件:
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/