通过各列

时间:2018-05-18 10:49:10

标签: r

在我的代码中,我使用多个left_join将单独的数据框合并到我在dplyr链中处理的数据帧。我将想要与另一个数据框合并的数据框导入到列表中,然后直接在该列表上进行一些操作,并使用lapply来准备它们进行合并。

截至目前,我已使用list2env(list, envir = .GlobalEnv)从列表中创建单独的数据框,然后使用left_join分别合并每个数据框,每个数据框的唯一列,如下所示:

测试数据:

列表:

structure(list(df2 = structure(list(x = structure(c(2L, 1L, 3L
), .Label = c("A", "B", "C"), class = "factor"), a = c(-0.331543943439452, 
0.0588350184156617, 1.03657229544754)), .Names = c("x", "a"), row.names = c(NA, 
-3L), class = "data.frame"), df3 = structure(list(z = structure(c(3L, 
2L, 1L), .Label = c("K", "L", "M"), class = "factor"), b = c(-0.897094152848114, 
0.97612075490695, 0.650264147064918)), .Names = c("z", "b"), row.names = c(NA, 
-3L), class = "data.frame")), .Names = c("df2", "df3"))

创建单独的数据框:

list2env(testlist, envir = .GlobalEnv)

数据框:

structure(list(x = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
    y = 1:3, z = structure(1:3, .Label = c("K", "L", "M"), class = "factor")), .Names = c("x", 
"y", "z"), row.names = c(NA, -3L), class = "data.frame")

加入:

library(dplyr)

test_df %>%
    left_join(., df2, by = "x") %>%
    left_join(., df3, by = "z")

(请注意,我的列表中有大约8个数据帧,每个数据帧有2到3列。为简单起见,我在此列表中仅包含两个数据帧)

所有数据框都有各自的“by”列。 我想知道的是,如果有更简单的方法可以做到这一点,f。 ex直接与整个列表合并,并自动检测哪些列相似并由它们合并为每个数据帧,而不是分别执行left_join八次?

修改

我尝试运行以下代码,如@akrun所建议的那样:

out <- test
for(i in seq_along(table_list)) {
  nm1 <- intersect(names(out), names(table_list[[i]]))
  out <- merge(out, table_list[[i]], by = nm1)
}
out

其中test是要合并的数据框,table_list是数据框列表。 这适用于这些小型测试数据帧,但似乎在数据帧中引入了各行的重复,从而产生更多行。

更复杂的示例数据框:

structure(list(x = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("A", "B", "C", "D"), class = "factor"), y = c(1, 
2, 3, 4, 1, 2, 3, 4), z = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L), .Label = c("K", "L", "M"), class = "factor")), .Names = c("x", 
"y", "z"), row.names = c(NA, -8L), class = "data.frame")

2 个答案:

答案 0 :(得分:1)

根据描述,似乎我们需要在每个merge之前检查相交的列名

out <- test_df
for(i in seq_along(testlist)) {
   nm1 <- intersect(names(test_df), names(testlist[[i]]))
   out <- merge(out, testlist[[i]], by = nm1, all.x = TRUE)
 }

out
#  z x y           a          b
#1 K A 1  0.05883502  0.6502641
#2 L B 2 -0.33154394  0.9761208
#3 M C 3  1.03657230 -0.8970942

答案 1 :(得分:1)

使用复杂的test_df,为什么不使用来自reduce的{​​{1}}和来自dplyr的left_join?我在下面的代码中包含了消息和警告消息。

purrr