我想合并两个数据帧列表。列表的长度不同,其中的数据帧也不同。
ls(df_list1)
[1] "0" "1" "14" "15" "16" "19" "2" "23" "25" "29" "3" "31" "32" "33" "36" "38" "4" "46" "48" "5" "57" "6" "61" "63"
[25] "7" "8" "9"
ls(df_list2)
[1] "0" "1" "10" "15" "16" "17" "19" "2" "24" "26" "3" "30" "32" "33" "34" "37" "39" "4" "47" "49" "5" "58" "6" "62"
[25] "64" "7" "8" "9"
我想将 df_list1 中的每个数据框与 df_list2 中的每个数据框合并。
对此进行了尝试,但是我无法将所有组合保存到 test 中,只是循环中的最后一次合并。
test=list()
for (i in 1:length(df_list1){
for (j in 1:length(df_list2){
test[[i]] <- inner_join(df_list1[[i]], df_list2[[j]], by="variable")
}
}
也许是这样的:
df_list1 <- list("0"=data.frame("variable" = c(2,4,8), "variable2" = c(13,14,53), "variable1" = "2019-05-31"),
"1"=data.frame("variable" = c(3,7,2), "variable2" = c(53,68,41), "variable1" = "2019-05-31"),
"4"=data.frame("variable" = c(6,5,6), "variable2" = c(24,52,83), "variable1" = "2019-05-31"))
df_list2 <- list("0"=data.frame("variable" = c(2,8,3), "variable2" = c(72,25,37), "variable1" = "2019-05-31"),
"3"=data.frame("variable" = c(2,7,6), "variable2" = c(24,62,45), "variable1" = "2019-05-31"),
"4"=data.frame("variable" = c(9,5,8), "variable2" = c(34,74,58), "variable1" = "2019-05-31"))
答案 0 :(得分:1)
我不确定您想要的输出是什么。根据您在帖子中提供的数据,我尝试对您的代码进行最小的更改,以查看是否正是您想要的:
由于尝试保存所有组合,因此应使用如下所示的for
循环,其中test[[length(test)+1]]
将用新生成的组合更新test
:
test=list()
for (i in 1:length(df_list1)) {
for (j in 1:length(df_list2)) {
test[[length(test)+1]] <- inner_join(df_list1[[i]], df_list2[[j]], by="variable")
}
}
如果要生成所有组合的数据框,则可以使其如下所示
df <- Reduce(rbind,test)
如此
> df
variable variable2.x variable1.x variable2.y variable1.y
1 2 13 2019-05-31 72 2019-05-31
2 8 53 2019-05-31 25 2019-05-31
3 2 13 2019-05-31 24 2019-05-31
4 8 53 2019-05-31 58 2019-05-31
5 3 53 2019-05-31 37 2019-05-31
6 2 41 2019-05-31 72 2019-05-31
7 7 68 2019-05-31 62 2019-05-31
8 2 41 2019-05-31 24 2019-05-31
9 6 24 2019-05-31 45 2019-05-31
10 6 83 2019-05-31 45 2019-05-31
11 5 52 2019-05-31 74 2019-05-31
答案 1 :(得分:0)
我以以下虚拟数据帧df1
和df2
为例,向您展示如何制作(如果我正确理解了您的目的)
df1 <- data.frame(a = 1:5, b = 6:10)
df2 <- data.frame(c = 1:6, d = 7:12)
看起来像
> df1
a b
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
> df2
c d
1 1 7
2 2 8
3 3 9
4 4 10
5 5 11
6 6 12
鉴于df1
比df2
短,我用df1
填充NA
,使其长度与df2
相同:
df1 <- data.frame(lapply(df1, `length<-`,nrow(df2)))
,然后df1
和df2
的所有合并组合都可以通过嵌套的sapply()
获得,即
df <- data.frame(unlist(lapply(df1, function(p) lapply(df2, function(q) data.frame(p,q))), recursive = F))
如此
> df
a.c.p a.c.q a.d.p a.d.q b.c.p b.c.q b.d.p b.d.q
1 1 1 1 7 6 1 6 7
2 2 2 2 8 7 2 7 8
3 3 3 3 9 8 3 8 9
4 4 4 4 10 9 4 9 10
5 5 5 5 11 10 5 10 11
6 NA 6 NA 12 NA 6 NA 12
答案 2 :(得分:0)
Base R解决方案:
"foo.surname is null"