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

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

当前回答

Dplyr有一个函数,允许您将特定列移动到其他列的前面或后面。当您使用大数据框架时,这是一个关键的工具(如果是4列,使用前面提到的select更快)。

https://dplyr.tidyverse.org/reference/relocate.html

在你的情况下,它将是:

df <- df %>% relocate(Out, .after = In)

简单而优雅。它还允许你一起移动几列,并将其移动到开始或结束:

df <- df %>% relocate(any_of(c('ColX', 'ColY', 'ColZ')), .after = last_col())

再次强调:当你使用大数据框架时,超级强大:)

其他回答

你可以使用数据。表包:

如何重新排序数据。表列(不复制)

require(data.table)
setcolorder(DT,myOrder)

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

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

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

Dplyr有一个函数,允许您将特定列移动到其他列的前面或后面。当您使用大数据框架时,这是一个关键的工具(如果是4列,使用前面提到的select更快)。

https://dplyr.tidyverse.org/reference/relocate.html

在你的情况下,它将是:

df <- df %>% relocate(Out, .after = In)

简单而优雅。它还允许你一起移动几列,并将其移动到开始或结束:

df <- df %>% relocate(any_of(c('ColX', 'ColY', 'ColZ')), .after = last_col())

再次强调:当你使用大数据框架时,超级强大:)

你也可以使用子集函数:

data <- subset(data, select=c(3,2,1))

您最好像在其他答案中那样使用[]操作符,但是知道您可以在单个命令中执行子集和列重新排序操作可能会很有用。

更新:

你也可以使用dplyr包中的select函数:

data = data %>% select(Time, out, In, Files)

我不确定效率如何,但由于dplyr的语法,这个解决方案应该更灵活,特别是如果您有很多列。例如,下面将以相反的顺序重新排列mtcars数据集的列:

mtcars %>% select(carb:mpg)

下面只会对一些列进行重新排序,而丢弃其他列:

mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))

阅读更多关于dplyr的选择语法。

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

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

# or

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