【发布时间】:2013-10-18 07:32:10
【问题描述】:
这只是为了回答这里的另一个问题。当您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)。
【问题讨论】:
-
有趣。虽然我个人宁愿
rbind在数据帧上注意匹配命名的子集(即列)。当您不想按名称“跟踪”事物时,首先使用matrix? -
不使用
matrix的一个(也许是唯一的)原因是它不允许混合类型。