Tôi muốn chuyển cột cuối cùng của khung dữ liệu lên đầu (như cột đầu tiên). Làm thế nào tôi có thể làm điều đó trong R?
Data.frame của tôi có khoảng một nghìn cột để thay đổi thứ tự sẽ không thành. Tôi chỉ muốn chọn một cột và "chuyển nó từ đầu".
Câu trả lời:
Tôi không biết liệu có đáng thêm điều này làm câu trả lời hay không hay một nhận xét sẽ ổn, nhưng tôi đã viết một hàm có tên moveme
cho phép bạn làm những gì bạn muốn với ngôn ngữ bạn mô tả. Bạn có thể tìm thấy hàm tại câu trả lời này: https://stackoverflow.com/a/18540144/1270695
Nó hoạt động trên names
của bạn data.frame
và tạo ra một vectơ ký tự mà bạn có thể sử dụng để sắp xếp lại các cột của mình:
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
Nếu bạn đang xáo trộn mọi thứ xung quanh như thế này, tôi khuyên bạn nên chuyển đổi của bạn data.frame
thành a data.table
và sử dụng setcolorder
(với moveme
chức năng của tôi , nếu bạn muốn) để thực hiện thay đổi bằng cách tham khảo.
Trong câu hỏi của bạn, bạn cũng đề cập đến "Tôi chỉ muốn chọn một cột và chuyển nó từ đầu". Nếu đó là một cột tùy ý và không cụ thể là cột cuối cùng, bạn cũng có thể xem bằng cách sử dụngsetdiff
.
Hãy tưởng tượng bạn đang làm việc với tập dữ liệu "mtcars" và muốn chuyển cột "am" về đầu.
x <- "am"
mtcars[c(x, setdiff(names(mtcars), x))]
Di chuyển cột cuối cùng lên đầu:
new_df <- df %>%
select(last_column_name, everything())
Điều này cũng hợp lệ cho bất kỳ cột nào và bất kỳ số lượng nào:
new_df <- df %>%
select(col_5, col_8, everything())
Ví dụ sử dụng mtcars
khung dữ liệu:
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
Bạn có thể thay đổi thứ tự của các cột bằng cách trang trí chúng theo thứ tự mới bằng cách chọn chúng một cách rõ ràng với data[,c(ORDER YOU WANT THEM TO BE IN)]
Nếu bạn chỉ muốn cột cuối cùng được sử dụng lần đầu: 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))]
Nếu bạn muốn di chuyển bất kỳ cột nào đã đặt tên đến vị trí đầu tiên, chỉ cần sử dụng:
df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]
dplyr 1.0.0
bây giờ bao gồm relocate()
chức năng sắp xếp lại các cột. Hành vi mặc định là di chuyển (các) cột được đặt tên đến vị trí đầu tiên.
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
Nhưng các vị trí khác có thể được xác định bằng .before
hoặc .after
đối số:
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
Phương pháp tiếp cận R nguyên gốc hoạt động với bất kỳ số hàng hoặc cột nào để di chuyển cột cuối cùng của khung dữ liệu đến vị trí cột đầu tiên:
df <- df[,c(ncol(df),1:ncol(df)-1)]
Nó có thể được sử dụng để di chuyển bất kỳ cột nào sang cột đầu tiên bằng cách thay thế:
df <- df[,c(your_column_number_here,1:ncol(df)-1)]
Nếu bạn không biết số cột, nhưng biết tên nhãn cột, hãy làm như sau thay thế "your_column_name_here":
columnNumber <- which(colnames(df)=="your_column_name_here")
df <- df[,c(columnNumber,1:ncol(df)-1)]