【发布时间】:2014-04-12 17:52:25
【问题描述】:
我想将数据框的最后一列移到开头(作为第一列)。我如何在 R 中做到这一点?
我的 data.frame 有大约一千列可以更改顺序。我只想选择一列并“将其移至开头”。
【问题讨论】:
我想将数据框的最后一列移到开头(作为第一列)。我如何在 R 中做到这一点?
我的 data.frame 有大约一千列可以更改顺序。我只想选择一列并“将其移至开头”。
【问题讨论】:
将最后一列移到开头:
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))]
dataframe<-dataframe[,c(1000, 1:999)]
这会将您的最后一列(即第 1000 列)移动到第一列。
【讨论】:
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 或.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
【讨论】:
我不知道是否值得将其添加为答案或评论是否可以,但我编写了一个名为 moveme 的函数,可让您使用您描述的语言做您想做的事情。您可以在此答案中找到该功能:https://stackoverflow.com/a/18540144/1270695
它适用于您的data.frame 的names,并生成一个字符向量,您可以使用该向量对列重新排序:
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 转换为data.table 并使用setcolorder(如果您愿意,可以使用我的moveme 函数)通过引用进行更改。
在您的问题中,您还提到“我只想选择一列并将其移至开头”。如果它是任意列,而不是最后一列,您还可以使用setdiff 查看。
假设您正在使用“mtcars”数据集并希望将“am”列移到开头。
x <- "am"
mtcars[c(x, setdiff(names(mtcars), x))]
【讨论】:
如果要将任何命名列移动到第一个位置,只需使用:
df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]
【讨论】:
neworder <- c(which(colnames(df)=="id"),which(colnames(df)!="id")) 然后 setcolorder(df, neworder)
使用任意数量的行或列将数据框的最后一列移动到第一列位置的原生 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:ncol(df)-1) 更改为which(colnames(df) != "your_column_name_here") 以获取剩余的列,而不是总是删除最后一列,如下面的@HT_079 建议的那样。
还有data.table 选项与setcolorder():
library(data.table)
mtcars_copy <- copy(mtcars)
setDT(mtcars_copy)
# Move column "gear" in the first position
setcolorder(mtcars_copy, neworder = "gear")
head(mtcars_copy)
# gear mpg cyl disp hp drat wt qsec vs am carb
# 1: 4 21.0 6 160 110 3.90 2.620 16.46 0 1 4
# 2: 4 21.0 6 160 110 3.90 2.875 17.02 0 1 4
# 3: 4 22.8 4 108 93 3.85 2.320 18.61 1 1 1
# 4: 3 21.4 6 258 110 3.08 3.215 19.44 1 0 1
# 5: 3 18.7 8 360 175 3.15 3.440 17.02 0 0 2
# 6: 3 18.1 6 225 105 2.76 3.460 20.22 1 0 1
如果有多个列,则在向量中提及顺序:
setcolorder(mtcars_copy, neworder = c("vs", "carb"))
head(mtcars_copy)
# vs carb gear mpg cyl disp hp drat wt qsec am
# 1: 0 4 4 21.0 6 160 110 3.90 2.620 16.46 1
# 2: 0 4 4 21.0 6 160 110 3.90 2.875 17.02 1
# 3: 1 1 4 22.8 4 108 93 3.85 2.320 18.61 1
# 4: 1 1 3 21.4 6 258 110 3.08 3.215 19.44 0
# 5: 0 2 3 18.7 8 360 175 3.15 3.440 17.02 0
# 6: 1 1 3 18.1 6 225 105 2.76 3.460 20.22 0
【讨论】:
将任何列从任何位置移动到数据中的第一个位置
n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])
【讨论】: