【问题标题】:Simplest way to get rbind to ignore column names让 rbind 忽略列名的最简单方法
【发布时间】: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 的一个(也许是唯一的)原因是它不允许混合类型。

标签: r rbind


【解决方案1】:

你可能会发现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),以便重新排序的列的名称与原始列的名称匹配。

【讨论】:

  • 谢谢,我一直在使用 plyr 包中的 rename,现在当我尝试从 OP 重新运行我的代码时,它不起作用。
  • @Thomas 是的,这是一个非常方便的小功能!
  • @mrip 好吧,我希望这对您的实际用例有用!
  • @SimonO101 我喜欢setNames 中代码的简洁性。
  • 这不会忽略它,是吗?它只是将名称设置为相同。
【解决方案2】:

这看起来很简单:

mapply(c,df,df[,2:1])
     x y
[1,] 1 3
[2,] 2 4
[3,] 3 1
[4,] 4 2

但是,对于这种简单的情况,您必须将其转回数据框(因为mapply 将其简化为矩阵):

as.data.frame(mapply(c,df,df[,2:1]))
  x y
1 1 3
2 2 4
3 3 1
4 4 2

重要说明 1:当您的数据框包含不同类型的向量时,类型强制似乎有不利之处:

df<-data.frame(x=1:2,y=3:4,z=c('a','b'))
mapply(c,df,df[,c(2:1,3)])
     x y z
[1,] 1 3 2
[2,] 2 4 1
[3,] 3 1 2
[4,] 4 2 1

重要提示2:有因素也很可怕。

df<-data.frame(x=factor(1:2),y=factor(3:4))
mapply(c,df[,1:2],df[,2:1])
     x y
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2

所以,只要你有所有的数字数据,就可以了。

【讨论】:

  • 但是如果你的df中有不同的数据类型,你会遇到麻烦。
  • @Roland 是的,我刚刚编辑了这个效果。无论如何?
  • 是的,写一个rbindByIndex 函数,OP 明确不想这样做......
  • 如果你没有因子,你可以通过data.frame(mapply(c(df,df[,c(2,1,3)]),SIMPLIFY=F)) 让它与混合类型一起工作,但它就没有那么简洁了。
  • 或使用Map,即mapply(...,SIMPLIFY=FALSE) - data.frame(Map(c,df,df[,2:1]))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2015-12-10
  • 2010-11-19
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多