Объединение нескольких фреймов данных в списке в другой фрейм данных по различным столбцам - PullRequest
0 голосов
/ 18 мая 2018

В моем коде я использовал несколько 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")

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Используя сложный test_df, почему бы не использовать reduce из purrr вместе с left_join из dplyr?Я включил сообщения и предупреждающие сообщения в код ниже.

library(dplyr)
library(purrr)

all_dfs <- reduce(my_list, left_join, .init = test_df)

# (warning) messages from using left_join
# Joining, by = "x"
# Joining, by = "z"
# Warning message:
# Column `x` joining factors with different levels, coercing to character vector 

all_dfs

  x y z           a          b
1 A 1 K  0.05883502  0.6502641
2 B 2 L -0.33154394  0.9761208
3 C 3 M  1.03657230 -0.8970942
4 D 4 K          NA  0.6502641
5 A 1 L  0.05883502  0.9761208
6 B 2 M -0.33154394 -0.8970942
7 C 3 K  1.03657230  0.6502641
8 D 4 L          NA  0.9761208
0 голосов
/ 18 мая 2018

Судя по описанию, нам нужно проверять имена пересекающихся столбцов перед каждым 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...