параллельная привязка фреймов данных, когда количество строк в фреймах данных может различаться

Рассмотрим следующий пример:

a1<-data.frame(a=c(1,2,3),b=c(4,5,6))
a2<-data.frame(a=c(5,6),b=c(7,8))
a3<-data.frame(e=c(34,26),f=c(41,65))
a4<-data.frame(e=c(13,25,567),f=c(14,57,56))

Я хочу связать a1 с a3 после удаления последней строки a1 и a2 с a4 после удаления последней строки a4 для создания

  a b  e  f
1 1 4 34 41
2 2 5 26 65

и

  a b  e  f
1 5 7 13 14
2 6 8 25 57

Map(cbind, list(a1,a2),list(a3,a4)), как было предложено в другом месте, будет работать, если только все фреймы данных имеют одинаковое количество строк. Как выполнить cbind после удаления дополнительных строк в любом из составляющих фреймов данных в cbind?


person user17144    schedule 27.02.2020    source источник


Ответы (2)


Мы можем получить все кадры данных в списке, используя mget, разделив их на две половины. Используйте их в Map, получите минимальное количество строк как из фрейма данных, подмножьте эти строки и cbind.

list_dfs <- mget(paste0('a', 1:4))

Map(function(x, y) {
    rows = seq_len(min(nrow(x), nrow(y)))
    cbind(x[rows, ], y[rows, ])
    },list_dfs[1:(length(list_dfs)/2)], 
      list_dfs[(length(list_dfs)/2 + 1):length(list_dfs)])

#$a1
#  a b  e  f
#1 1 4 34 41
#2 2 5 26 65

#$a2
#  a b  e  f
#1 5 7 13 14
#2 6 8 25 57
person Ronak Shah    schedule 27.02.2020

Вы можете использовать nrow для доступа/исключения последних строк.

Map(cbind, list(a1[-nrow(a1), ], a2), list(a3, a4[-nrow(a4), ]))
# [[1]]
#   a b  e  f
# 1 1 4 34 41
# 2 2 5 26 65
# 
# [[2]]
#   a b  e  f
# 1 5 7 13 14
# 2 6 8 25 57
person jay.sf    schedule 27.02.2020
comment
Что именно делает -nrow(a1)? - person user17144; 27.02.2020
comment
Попробуйте nrow(a1), это даст вам количество строк a1, то есть номер строки последней строки. - исключает эту строку. - person jay.sf; 27.02.2020
comment
Спасибо. Это работает. Мне нужен общий метод, как показано в ответе выше. - person user17144; 27.02.2020