如何改变这个输入(顺序:时间,输入,输出,文件):

Time   In    Out  Files
1      2     3    4
2      3     4    5

到这个输出(序列:时间,输出,输入,文件)?

Time   Out   In  Files
1      3     2    4
2      4     3    5

这是虚拟R数据:

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5

当前回答

你的数据帧有四列,比如df[,c(1,2,3,4)]。 注意,第一个逗号表示保留所有行,1、2、3、4表示列。

要像上面的问题一样改变顺序,请执行df2[,c(1,3,2,4)]

如果你想以csv格式输出这个文件,请执行write.csv(df2, file="somedf.csv")

其他回答

一个dplyr解决方案(tidyverse包集的一部分)是使用select:

select(table, "Time", "Out", "In", "Files") 

# or

select(table, Time, Out, In, Files)

你的数据帧有四列,比如df[,c(1,2,3,4)]。 注意,第一个逗号表示保留所有行,1、2、3、4表示列。

要像上面的问题一样改变顺序,请执行df2[,c(1,3,2,4)]

如果你想以csv格式输出这个文件,请执行write.csv(df2, file="somedf.csv")

得分最高的三个答案都有一个弱点。

如果数据帧是这样的

df <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))

> df
  Time In Out Files
1    1  2   3     4
2    2  3   4     5

那么这是一个糟糕的解决方案

> df2[,c(1,3,2,4)]

它完成了这项工作,但是您刚刚引入了对输入中列的顺序的依赖。

这种脆弱的编程风格是要避免的。

显式的列命名是一个更好的解决方案

data[,c("Time", "Out", "In", "Files")]

另外,如果您打算在更通用的设置中重用代码,您可以简单地

out.column.name <- "Out"
in.column.name <- "In"
data[,c("Time", out.column.name, in.column.name, "Files")]

这也很好,因为它完全隔离了字面量。相比之下,如果使用dplyr的select

data <- data %>% select(Time, out, In, Files)

然后你就会让那些以后会阅读你的代码的人,包括你自己,受到一点欺骗。列名被用作字面量,而不会出现在代码中。

data.table::setcolorder(table, c("Out", "in", "files"))
# reorder by column name
data <- data[, c("A", "B", "C")] # leave the row index blank to keep all rows

#reorder by column index
data <- data[, c(1,3,2)] # leave the row index blank to keep all rows