【问题标题】:Changing columns positions in a data frame without total reassignment在不完全重新分配的情况下更改数据框中的列位置
【发布时间】:2013-08-10 21:40:55
【问题描述】:

我想交换 data.frame 中的两列。我知道我可以这样做:

dd <- dd[c(1:4, 6:5, 7:10)]

但我觉得它不优雅,可能很慢(?)并且不适合程序(您需要知道length(dd),甚至在某些情况下交换的列是否接近该值......) 有没有一种简单的方法可以在不重新分配整个数据框的情况下做到这一点?

dd[2:3] <- dd[3:2]

结果是非常“有损”,因为[ &lt;- 只涉及值,而不涉及属性。比如:

(dd <- data.frame( A = 1:4, Does = 'really', SO = 'rock' ) )
dd[3:2] 
dd[2:3] <- dd[2:1]
print(dd)

列名明显没有翻转……

有什么想法吗?我还可以在我很长的列表中添加一个小的自定义函数,但是 grrr... 应该是一种方法。 ;-)

【问题讨论】:

  • data.table pacakge 允许您在不重新分配的情况下对列进行重新排序,但语法可能不会比您正在做的更清晰-stackoverflow.com/questions/12232041/…
  • 但是需要注意的是setcolorder通过引用改变了col顺序。没有复制。所以,它
  • 反转 10 x 1e6 数据帧中的列大约需要 7 毫秒。因此,除非您一直这样做,否则它不太可能成为代码中的瓶颈,您应该担心的是表现力,而不是速度。
  • @thelatemail 非常好的参考“data.table”,一个非常棒的包。我几乎在我的问题中提到了它,但想保持重点。所以你的评论很完美,谢谢;-)

标签: r


【解决方案1】:

不是单一功能,而是比较简单:

dd[replace(seq(dd), 2:3, 3:2)]

  A   SO   Does
1 1 rock really
2 2 rock really
3 3 rock really
4 4 rock really

【讨论】:

  • 迄今为止最好的解决方案。谢谢!
【解决方案2】:

这个:

dd[,2:3] <- dd[,3:2]

有效,但您还必须更新名称:

names(dd)[2:3] <- names(dd)[3:2]

【讨论】:

  • 谢谢,但我在问题中提到了它,这并不是我真正想要的。 (我想避免以后叫名字)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多