当数据帧的行数可能不同时,并行绑定数据帧

问题描述 投票:0回答:2

请考虑以下示例-

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的最后一行后将a1绑定到a3,在删除a4的最后一行后将a2绑定到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中的任何组成数据帧中删除多余的行后如何绑定?

r cbind
2个回答
0
投票

我们可以使用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

0
投票

您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.