这只是在回答另一个问题时出现的。当您rbind
两个数据框时,它会按名称而不是索引匹配列,这可能会导致意外行为:
> 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
实际上并不是这样工作的(尽管我以为我最初写这个的时候它可以工作......)。通过重命名来做到这一点的方法是使用SimonO101的解决方案:
rbind(df,setNames(df[,2:1],names(df)))
此外,也许令人惊讶的是,
data.frame(rbindlist(list(df,df[,2:1])))
按索引工作(如果我们不介意数据表,那么它非常简洁),所以这是 do.call(rbind)
之间的区别。
问题是,rbind
两个名称不匹配的数据框的最简洁方法是什么?我知道这看起来微不足道,但这种事情最终可能会使代码变得困惑。我不想编写一个名为 rbindByIndex 的新函数。理想情况下,它应该类似于 rbind(df,df[,2:1],byIndex=T)。
最佳答案
您可能会发现setNames
在这里很方便......
rbind(df, setNames(rev(df), names(df)))
# x y
#1 1 3
#2 2 4
#3 3 1
#4 4 2
我怀疑您的真实用例更加复杂。当然,您可以根据需要对 setNames
第一个参数中的列进行重新排序,只需在第二个参数中使用 names(df)
,以便重新排序的列的名称匹配原来的。
关于r - 让 rbind 忽略列名的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297475/