В моем коде я использовал несколько 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")
(Примечаниечто мой список содержит около восьми фреймов данных по 2–3 столбца в каждом. Для простоты я включил в этот список только два фрейма данных
Все фреймы данных имеют свой отдельный столбец «по». Я хочу знать, есть ли более простой способ сделать это, f.Например, путем непосредственного слияния со всем списком и автоматического определения, какие столбцы похожи, и слияния по ним для каждого фрейма данных вместо выполнения 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")