如何合并两个大部分不同的数据框列表,并在 R 中绑定这些数据框的同名行?
How do I merge two lists of mostly differing dataframes and bind the rows of those dataframes with the same name in R?
我有两个不同的数据帧列表。两个列表中的一些数据框具有相同的名称,而另一些则不同。当我合并这两个列表时,我需要将具有相同名称的数据框合并为 rbind 样式,并且在两个列表中唯一的数据框仅保留为唯一数据框并添加到新创建的合并数据框列表中。
list1 可能比 list2 具有更多的数据帧和每个数据帧更多的行,因为它将是循环结果的累积绑定列表。 list2是每次循环的新结果要加到累加的list1。
模拟示例:
mydf1 <- data.frame(V1=1, V2=rep("A", 4))
mydf2 <- data.frame(V1=1, V2=rep("B", 3))
mydf3 <- data.frame(V1=1, V2=rep("C", 2))
mydf4 <- data.frame(V1=2, V2="A")
mydf5 <- data.frame(V1=3, V2="C")
mydf6 <- data.frame(V1=4, V2="D")
mydf7 <- data.frame(V1=7, V2="E")
list1 <- list(AA=mydf1, BB=mydf2, CC=mydf3)
list2 <- list(AA=mydf4, CC=mydf5, DD=mydf6, EE=mydf7)
预期结果:
$AA
V1 V2
1 1 A
2 1 A
3 1 A
4 1 A
1 2 A
$BB
V1 V2
1 1 B
2 1 B
3 1 B
$CC
V1 V2
1 1 C
2 1 C
1 3 C
$DD
V1 V2
1 4 D
$EE
V1 V2
1 7 E
我已尝试使用解决方案 here,但未能使它们正常工作。
此解决方案没有将正确的数据帧放在一起,而是创建了其他奇怪的组合。
(m <- match(names(list2), names(list1), nomatch = 0L))
# [1] 1 1 2
Map(rbind, list1[m], list2)
而且这个似乎从不绑定同名的数据帧,所有数据帧只保留 1 行。
stackMe <- function(x) {
a <- eval.parent(quote(names(X)))[substitute(x)[[3]]]
rbind(list1[[a]], x)
}
lapply(list2, stackMe)
如何合并两个数据框列表,其中那些具有相同名称的数据框只是 append/rbind 行,而其他唯一数据框只是添加到列表中?
我们可以使用 Map
的索引
list1[names(list2)] <- Map(rbind, list1[names(list2)], list2)
list1
#$AA
# V1 V2
#1 1 A
#2 1 A
#3 1 A
#4 1 A
#5 2 A
#$BB
# V1 V2
#1 1 B
#2 1 B
#3 1 B
#$CC
# V1 V2
#1 1 C
#2 1 C
#3 3 C
#$DD
# V1 V2
#1 4 D
#$EE
# V1 V2
#1 7 E
我有两个不同的数据帧列表。两个列表中的一些数据框具有相同的名称,而另一些则不同。当我合并这两个列表时,我需要将具有相同名称的数据框合并为 rbind 样式,并且在两个列表中唯一的数据框仅保留为唯一数据框并添加到新创建的合并数据框列表中。
list1 可能比 list2 具有更多的数据帧和每个数据帧更多的行,因为它将是循环结果的累积绑定列表。 list2是每次循环的新结果要加到累加的list1。
模拟示例:
mydf1 <- data.frame(V1=1, V2=rep("A", 4))
mydf2 <- data.frame(V1=1, V2=rep("B", 3))
mydf3 <- data.frame(V1=1, V2=rep("C", 2))
mydf4 <- data.frame(V1=2, V2="A")
mydf5 <- data.frame(V1=3, V2="C")
mydf6 <- data.frame(V1=4, V2="D")
mydf7 <- data.frame(V1=7, V2="E")
list1 <- list(AA=mydf1, BB=mydf2, CC=mydf3)
list2 <- list(AA=mydf4, CC=mydf5, DD=mydf6, EE=mydf7)
预期结果:
$AA
V1 V2
1 1 A
2 1 A
3 1 A
4 1 A
1 2 A
$BB
V1 V2
1 1 B
2 1 B
3 1 B
$CC
V1 V2
1 1 C
2 1 C
1 3 C
$DD
V1 V2
1 4 D
$EE
V1 V2
1 7 E
我已尝试使用解决方案 here,但未能使它们正常工作。
此解决方案没有将正确的数据帧放在一起,而是创建了其他奇怪的组合。
(m <- match(names(list2), names(list1), nomatch = 0L))
# [1] 1 1 2
Map(rbind, list1[m], list2)
而且这个似乎从不绑定同名的数据帧,所有数据帧只保留 1 行。
stackMe <- function(x) {
a <- eval.parent(quote(names(X)))[substitute(x)[[3]]]
rbind(list1[[a]], x)
}
lapply(list2, stackMe)
如何合并两个数据框列表,其中那些具有相同名称的数据框只是 append/rbind 行,而其他唯一数据框只是添加到列表中?
我们可以使用 Map
list1[names(list2)] <- Map(rbind, list1[names(list2)], list2)
list1
#$AA
# V1 V2
#1 1 A
#2 1 A
#3 1 A
#4 1 A
#5 2 A
#$BB
# V1 V2
#1 1 B
#2 1 B
#3 1 B
#$CC
# V1 V2
#1 1 C
#2 1 C
#3 3 C
#$DD
# V1 V2
#1 4 D
#$EE
# V1 V2
#1 7 E