У меня есть список фреймов данных с похожими именами переменных, к которым я хочу присоединиться с помощью full_join в том порядке, в котором они появляются в списке.

require(tidyverse)

x<-data.frame(id=c("a","a","b","b","b","c","c","c","c"),
              sub.id=c("1","2","1","2","3","1","2","3","4"))

y<-data.frame(id = as.character(rep(1:4,each=2)),
              sub.id = c("AA","CC","DD","AA","GG","OO","PP","OW"))

z<-data.frame(id = c("AA","CC","DD","GG","OO","OW","PP"),
              sub.id = as.character(1:7))

dfs<-list(x,y,z)

Я пробовал использовать reduce из пакета purrr, но это объединит все фреймы данных в списке с первым фреймом данных. В этом случае фрейм данных x.

dfs %>% 
  reduce(full_join,by = c("sub.id" = "id"))

Есть ли способ выполнить full_join для фреймов данных, найденных в списке, так, чтобы by следовал последовательности, в которой фреймы данных появляются в списке? В этом примере sub.id из x будет соответствовать id из y, а затем sub.id из y после присоединения будет соответствовать id из z для финального соединения.

РЕДАКТИРОВАТЬ: ожидаемый результат должен быть аналогичен следующему:

    id sub.id.x sub.id.y sub.id.y.y
1   a        1       AA          1
2   a        1       CC          2
3   a        2       DD          3
4   a        2       AA          1
5   b        1       AA          1
6   b        1       CC          2
7   b        2       DD          3
8   b        2       AA          1
9   b        3       GG          4
10  b        3       OO          5
11  c        1       AA          1
12  c        1       CC          2
13  c        2       DD          3
14  c        2       AA          1
15  c        3       GG          4
16  c        3       OO          5
17  c        4       PP          7
18  c        4       OW          6

Суффиксы имени объединенного столбца в настоящее время не изменились.

0
Israel Girón-Palacios 12 Ноя 2020 в 03:01

2 ответа

Лучший ответ

Возможно, нам понадобится цикл for для изменения имен столбцов после каждого соединения сгенерированного вывода

out <- dfs[[1]]
for(i in 2:length(dfs)) {
    out <- full_join(out, dfs[[i]], by = c('sub.id' = 'id'))
    names(out)[names(out) == 'sub.id'] <- paste0("sub.id", i)
    names(out)[names(out) == 'sub.id.y'] <- 'sub.id'
  }

-вывод

out
#   id sub.id2 sub.id3 sub.id
#1   a       1      AA      1
#2   a       1      CC      2
#3   a       2      DD      3
#4   a       2      AA      1
#5   b       1      AA      1
#6   b       1      CC      2
#7   b       2      DD      3
#8   b       2      AA      1
#9   b       3      GG      4
#10  b       3      OO      5
#11  c       1      AA      1
#12  c       1      CC      2
#13  c       2      DD      3
#14  c       2      AA      1
#15  c       3      GG      4
#16  c       3      OO      5
#17  c       4      PP      7
#18  c       4      OW      6
2
akrun 12 Ноя 2020 в 00:11

Если мы можем предположить, что соединяющиеся столбцы всегда находятся в конце первого фрейма данных, а первый - во втором фрейме данных, тогда вы могли бы сделать:

В базе R:

Reduce(function(x,y) merge(x,y,by.x = tail(names(x),1), by.y = names(y)[1], all = TRUE), dfs)

   sub.id1 sub.id0 id sub.id11
1       AA       1  a        1
2       AA       2  a        1
3       AA       1  c        1
4       AA       2  b        1
5       AA       1  b        1
6       AA       2  c        1
7       CC       1  a        2
8       CC       1  b        2
9       CC       1  c        2
10      DD       2  b        3
11      DD       2  a        3
12      DD       2  c        3
13      GG       3  b        4
14      GG       3  c        4
15      OO       3  b        5
16      OO       3  c        5
17      OW       4  c        6
18      PP       4  c        7
2
Onyambu 12 Ноя 2020 в 00:24