【发布时间】: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]
结果是非常“有损”,因为[ <- 只涉及值,而不涉及属性。比如:
(dd <- data.frame( A = 1:4, Does = 'really', SO = 'rock' ) )
dd[3:2]
dd[2:3] <- dd[2:1]
print(dd)
列名明显没有翻转……
有什么想法吗?我还可以在我很长的列表中添加一个小的自定义函数,但是 grrr... 应该是一种方法。 ;-)
【问题讨论】:
-
data.tablepacakge 允许您在不重新分配的情况下对列进行重新排序,但语法可能不会比您正在做的更清晰-stackoverflow.com/questions/12232041/… -
但是需要注意的是
setcolorder通过引用改变了col顺序。没有复制。所以,它快。 -
反转 10 x 1e6 数据帧中的列大约需要 7 毫秒。因此,除非您一直这样做,否则它不太可能成为代码中的瓶颈,您应该担心的是表现力,而不是速度。
-
@thelatemail 非常好的参考“data.table”,一个非常棒的包。我几乎在我的问题中提到了它,但想保持重点。所以你的评论很完美,谢谢;-)
标签: r