我希望将数据框的最后一列移到开头(作为第一列)。我怎么能在R?
中做到这一点我的data.frame有大约一千列来改变订单。我只想选择一列并“将其移至开头”。
答案 0 :(得分:104)
将最后一列移至开头:
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
数据框的示例:
# cat /proc/cmdline
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
答案 1 :(得分:25)
您可以通过使用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
答案 2 :(得分:14)
我不知道是否值得将此作为答案添加或者评论是否合适,但我写了一个名为moveme
的函数,它可以让您使用您描述的语言执行您想要的操作。您可以在此答案中找到该功能:https://stackoverflow.com/a/18540144/1270695
它适用于names
的{{1}},并生成一个可用于重新排序列的字符向量:
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
并使用data.table
(使用我的setcolorder
功能,如果您愿意的话)通过引用进行更改。
在您的问题中,您还提到“我只想选择一列并将其移至开头”。如果它是一个任意列,而不是特定列,您还可以查看使用moveme
。
想象一下,您正在使用“mtcars”数据集,并希望将“am”列移至开头。
setdiff
答案 3 :(得分:13)
dataframe<-dataframe[,c(1000, 1:999)]
这会将您的最后一列(即第1000列)移动到第一列。
答案 4 :(得分:12)
如果要将任何命名列移动到第一个位置,只需使用:
df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]
答案 5 :(得分:11)
Single(...)
现在包括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
答案 6 :(得分:1)
将任意列从任意位置移至数据中的第一个位置
n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])
答案 7 :(得分:0)
还有带有 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