这是对另一个问题的回答.当输入两个数据帧时,它会按名称而不是索引匹配列,这可能会导致意外行为:
> df<-data.frame(x=1:2,y=3:4)
> df
x y
1 1 3
2 2 4
> rbind(df,df[,2:1])
x y
1 1 3
2 2 4
3 1 3
4 2 4
当然,也有变通办法.例如:
rbind(df,rename(df[,2:1],names(df)))
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))
编辑:plyr
软件包中的rename
实际上不是这样工作的(尽管我最初写这篇文章时以为它能工作…).重命名的方法是使用SimonOplyr
的解决方案:
rbind(df,setNames(df[,2:1],names(df)))
而且,也许令人惊讶,
data.frame(rbindlist(list(df,df[,2:1])))
按索引工作(如果我们不介意数据表,那么它非常简洁),所以这是do.call(rbind)
之间的差异.
问题是,对于两个名称不匹配的数据帧,最简洁的方法是什么?我知道这看起来很琐碎,但这类事情最终会导致代码混乱.我不想写一个名为rbindByIndex
的新函数.理想情况下应该是rbind(df,df[,2:1],byIndex=T)
左右.