合并不同长度的数据帧列表

时间:2019-12-18 08:17:40

标签: r list dataframe merge

我想合并两个数据帧列表。列表的长度不同,其中的数据帧也不同。

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"))

3 个答案:

答案 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)

我以以下虚拟数据帧df1df2为例,向您展示如何制作(如果我正确理解了您的目的)

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

鉴于df1df2短,我用df1填充NA,使其长度与df2相同:

df1 <- data.frame(lapply(df1, `length<-`,nrow(df2)))

,然后df1df2的所有合并组合都可以通过嵌套的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"