如何匹配与列名匹配的矢量?

Rob*_*ick 25 r rbind

绑定向量时,rbind不检查列名:

l = list(row1 = c(10, 20), row2 = c(20, 10))
names(l$row1) = c("A", "B")
names(l$row2) = c("B", "A")
l
$row1
 A  B 
10 20 

$row2
 B  A 
20 10 

rbind(l$row1, l$row2)
      A  B
[1,] 10 20
[2,] 20 10
Run Code Online (Sandbox Code Playgroud)

如何从多个列表元素生成此矩阵,确保列名在行间正确匹配:

      A  B
[1,] 10 20
[2,] 10 20
Run Code Online (Sandbox Code Playgroud)

Ari*_*man 21

smartbind() 将匹配列名称并容忍丢失的名称:

library(gtools)
do.call(smartbind,l)
      A  B
row1 10 20
row2 10 20
Run Code Online (Sandbox Code Playgroud)

  • `plyr :: rbind.fill`是一个类似的解决方案. (5认同)

scs*_*s76 17

似乎在当前版本的R(我有版本3.3.0)中,rbind即使它们的顺序不同,也能够连接具有相同名称列的两个数据集.

   df1 <- data.frame(a = c(1:5), c = c(LETTERS[1:5]),b=c(11:15))
   df2 <- data.frame(a = c(6:10), b = c(16:20),c=c(LETTERS[6:10]))
   rbind(df1,df2)
    a c  b
1   1 A 11
2   2 B 12
3   3 C 13
4   4 D 14
5   5 E 15
6   6 F 16
7   7 G 17
8   8 H 18
9   9 I 19
10 10 J 20
Run Code Online (Sandbox Code Playgroud)


Sve*_*ein 12

你可以使用match:

l <- list(row1 = setNames(1:3, c("A", "B", "C")),
          row2 = setNames(1:3, c("B", "C", "A")),
          row3 = setNames(1:3, c("C", "A", "B")))

do.call(rbind, lapply(l, function(x) x[match(names(l[[1]]), names(x))]))
Run Code Online (Sandbox Code Playgroud)

结果:

     A B C
row1 1 2 3
row2 3 1 2
row3 2 3 1
Run Code Online (Sandbox Code Playgroud)

  • 请参阅下面@ scs76的答案; 不再需要此解决方案. (3认同)
  • 如果“行”具有不同数量的元素,则仍然需要这样做。 (2认同)

Sch*_*unW 12

rbind 如果您首先将l的每个元素更改为数据框,它将起作用:

do.call("rbind", lapply(l, function(x) data.frame(as.list(x))))

      A  B
row1 10 20
row2 10 20
Run Code Online (Sandbox Code Playgroud)

  • +1!并且还注意到这里有趣的是来自`data.table`的经典等价`rbindlist`与`do.call(rbind,...)没有给出相同的答案. (2认同)

Mat*_*rde 7

do.call(rbind, lapply(l, function(row) row[order(names(row))]))
Run Code Online (Sandbox Code Playgroud)