将列移到数据框中的第一位置


77

我想将数据框的最后一列移到开头(作为第一列)。我如何在R中做到这一点?

我的data.frame有大约一千列要更改的顺序。我只想选择一列并“将其移至开始”。

Answers:


22

我不知道是否值得将其添加为答案或注释是否合适,但是我编写了一个名为的函数moveme,该函数可以让您使用所描述的语言来做您想做的事情。您可以在以下答案中找到该功能:https : //stackoverflow.com/a/18540144/1270695

它适用于names您的,data.frame并产生一个字符向量,可用于重新排列列:

mydf <- data.frame(matrix(1:12, ncol = 4))
mydf
moveme(names(mydf), "X4 first")
# [1] "X4" "X1" "X2" "X3"
moveme(names(mydf), "X4 first; X1 last")
# [1] "X4" "X2" "X3" "X1"

mydf[moveme(names(mydf), "X4 first")]
#   X4 X1 X2 X3
# 1 10  1  4  7
# 2 11  2  5  8
# 3 12  3  6  9

如果您要像这样反复调整,我建议将您转换data.frame为adata.table并使用setcolordermoveme如果需要,请使用我的函数)通过​​引用进行更改。


在您的问题中,您还提到了“我只想选择一列并将其移到开头”。如果是任意列,而不是最后一列,那么您也可以使用setdiff

假设您正在使用“ mtcars”数据集,并且想将“ am”列移到开头。

x <- "am"
mtcars[c(x, setdiff(names(mtcars), x))]

184

Dplyr的select()方法

将最后一列移到开头:

new_df <- df %>%
  select(last_column_name, everything())

这对于任何列和任何数量也有效:

new_df <- df %>%
  select(col_5, col_8, everything())

使用mtcars数据框的示例:

head(mtcars, n = 2)
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

# Last column is 'carb'
new_df <- mtcars %>% select(carb, everything())

head(new_df, n = 2)
#                   carb  mpg cyl disp  hp drat    wt  qsec vs am gear
# Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
# Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4

35

您可以更改列的顺序,方法是使用以下命令显式选择它们以新的顺序处理它们: data[,c(ORDER YOU WANT THEM TO BE IN)]

如果只希望最后一列首先使用: data[,c(ncol(data),1:(ncol(data)-1))]

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

> head(cars[,c(2,1)])
  dist speed
1    2     4
2   10     4
3    4     7
4   22     7
5   16     8
6   10     9

谢谢,这将破坏整个数据帧的破坏(我的DF有1000列)
ECII 2014年

8
然后就使用data[,c(ncol(data),1:(ncol(data)-1))]
Rentrop

正是我想要的。我不得不在其他33列的开头移动最后8列,并且使用了。expr <-expr1 [,c(33:40,1:(32))]谢谢!
Urvah Shabbir

26
dataframe<-dataframe[,c(1000, 1:999)]

这会将您的最后一列(即第1000列)移到第一列。


19

如果要将任何命名的列移到第一位置,只需使用:

df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]

2
这无疑是最好的答案在这里
尼尔Barsch

1
当命名列是有序因素时,这似乎不起作用。
DLyons

10

dplyr 1.0.0现在包括relocate()重新排序列的功能。默认行为是将命名列移动到第一个位置。

library(dplyr) # from version 1.0.0 

mtcars %>%
  relocate(carb) %>%
  head()

                  carb  mpg cyl disp  hp drat    wt  qsec vs am gear
Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
Datsun 710           1 22.8   4  108  93 3.85 2.320 18.61  1  1    4
Hornet 4 Drive       1 21.4   6  258 110 3.08 3.215 19.44  1  0    3
Hornet Sportabout    2 18.7   8  360 175 3.15 3.440 17.02  0  0    3
Valiant              1 18.1   6  225 105 2.76 3.460 20.22  1  0    3

但是其他位置可以通过.beforeor.after参数指定:

mtcars %>%
  relocate(gear, carb, .before = cyl) %>%
  head()

                   mpg gear carb cyl disp  hp drat    wt  qsec vs am
Mazda RX4         21.0    4    4   6  160 110 3.90 2.620 16.46  0  1
Mazda RX4 Wag     21.0    4    4   6  160 110 3.90 2.875 17.02  0  1
Datsun 710        22.8    4    1   4  108  93 3.85 2.320 18.61  1  1
Hornet 4 Drive    21.4    3    1   6  258 110 3.08 3.215 19.44  1  0
Hornet Sportabout 18.7    3    2   8  360 175 3.15 3.440 17.02  0  0
Valiant           18.1    3    1   6  225 105 2.76 3.460 20.22  1  0

4

一种本机R方法,可与任意数量的行或列配合使用,以将数据框的最后一列移至第一列位置:

df <- df[,c(ncol(df),1:ncol(df)-1)]

通过替换,它可以用于将任何列移动到第一列:

df <- df[,c(your_column_number_here,1:ncol(df)-1)]

如果您不知道列号,但是知道列标签名称,请执行以下替换“ your_column_name_here”的操作:

columnNumber <- which(colnames(df)=="your_column_name_here")
df <- df[,c(columnNumber,1:ncol(df)-1)]

1

将任意列从任意位置移至数据中的第一个位置

n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.