我想将数据框的最后一列移到开头(作为第一列)。我如何在R中做到这一点?
我的data.frame有大约一千列要更改的顺序。我只想选择一列并“将其移至开始”。
Answers:
我不知道是否值得将其添加为答案或注释是否合适,但是我编写了一个名为的函数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
并使用setcolorder
(moveme
如果需要,请使用我的函数)通过引用进行更改。
在您的问题中,您还提到了“我只想选择一列并将其移到开头”。如果是任意列,而不是最后一列,那么您也可以使用setdiff
。
假设您正在使用“ mtcars”数据集,并且想将“ am”列移到开头。
x <- "am"
mtcars[c(x, setdiff(names(mtcars), x))]
将最后一列移到开头:
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
您可以更改列的顺序,方法是使用以下命令显式选择它们以新的顺序处理它们: 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
data[,c(ncol(data),1:(ncol(data)-1))]
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
但是其他位置可以通过.before
or.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
一种本机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)]
将任意列从任意位置移至数据中的第一个位置
n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])