R dplyr - зацикливание списка фреймов данных%>% left-join%>% нескольких фреймов данных - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно объединить несколько разных фреймов данных.

С одной стороны, у меня есть несколько фреймов данных с метаданными A, а с другой стороны, соответствующая информация B.

A.
[1] "LOJun_Meta" "LOMay_Meta" "VOJul_Meta" "VOJun_Meta" "VOMay_Meta" "ZOJun_Meta"
[7] "ZOMay_Meta"

B.
[1] "LOJun_All." "LOMay_all." "VOJul_All." "VOJun_all." "VOMay_all." "ZOJun_all."
[7] "ZOMay_all."

Имена фреймов данныхуже в формате списка (то есть list1 и list2), и кадры данных уже импортированы в R.

Моя цель - создать цикл, который бы объединял dplyr > left-join соответствующих кадров данных.Например:

LOJun_Meta + LOJun_All; LoMay_Meta + LOJun_all etc...

Что мне трудно сделать, так это создать цикл, который бы "синхронизировал" процедуру "слияния".

Я не уверен, стоит ли мне создавать функцию, котораябудет иметь два входа и будет выполнять такое «объединение».

Это будет что-то вроде

merging(list1, list2){
  for i in length(list):
    left_join(list1[i], list[2], by = c("PrimaryKey" = "ForeignKey"))
}

Я считаю, что проблема заключается в том, что функция должна ссылаться на кадры данных, которые не list1 & list2 значения, но имена фреймов данных хранятся в list1 & list2.

Есть идеи?

Спасибо большое!Приветствия

Диаграмма того, чего я намерен достичь, представлена ​​ниже:

[Диаграмма цикла - dplyr / несколько кадров данных 1

Примерто, что я хотел бы автоматизировать, было бы следующим действием: ZOMay<- left_join(ZOMay_Meta, ZOMay_all., by = c("Primary Key" = "Foreign key")) ZOJun<- left_join(ZOJun_Meta, ZOJun_all., by = c("Primary Key" = "Foreign Key")) write.csv(ZOMay, file = "ZOMay_Consolidated.csv") write.csv(ZOMay, file = "ZOJun_Consolidated.csv")

1 Ответ

0 голосов
/ 11 сентября 2018

Вот пример того, как вы могли бы построить воспроизводимый пример для вашей ситуации:

library(tidyverse)
df1a <- data_frame(id = 1:3, var1 = LETTERS[1:3])
df2a <- data_frame(id = 1:3, var1 = LETTERS[4:6])
df1b <- data_frame(id = 1:3, var2 = LETTERS[7:9])
df2b <- data_frame(id = 1:3, var2 = LETTERS[10:12])

list1 <- list(df1a, df2a)
list2 <- list(df1b, df2b)

Теперь, насколько я понимаю, вы хотите сделать left_join для df1a и df1b, кака также df2a и df2b.Вместо цикла вы можете использовать map2 из пакета purrr.Это будет повторять два списка и применять функцию к каждой паре элементов.

map2(list1, list2, left_join)
# [[1]]
# # A tibble: 3 x 3
#        id var1  var2 
#     <int> <chr> <chr>
#   1     1 A     G    
#   2     2 B     H    
#   3     3 C     I    
# 
# [[2]]
# # A tibble: 3 x 3
#        id var1  var2 
#     <int> <chr> <chr>
#   1     1 D     J    
#   2     2 E     K    
#   3     3 F     L 
...