r - 让 rbind 忽略列名的最简单方法

标签 r rbind

这只是在回答另一个问题时出现的。当您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/

相关文章:

r - ggplot2错误: scale_x_date Showing/Not Dropping Data Outside Specified Limits

r - 将矩阵列表转换为单个数据框

r - 在 R 中合并两个平面列联表 (ftable)?

arrays - 将 3d 数组中的工作表行绑定(bind)为 2d 数组

r - data.table 按列名操作

r - f# Rprovider 与 TTR 包相关的问题

r - 如何在不使用 scale = free 的情况下在 facet wraps 中填充整个饼图

r - 合并嵌套列表中的数据框

r - 数据框在 R 中交替行绑定(bind)

r - 根据行名匹配两个数据框并添加 NA