Di chuyển một cột đến vị trí đầu tiên trong khung dữ liệu


79

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:


24

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 movemecho 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 namescủa bạn data.framevà 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.framethành a data.tablevà sử dụng setcolorder(với movemechứ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))]

186

Phương pháp select () của Dplyr

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 mtcarskhung 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

35

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

Cảm ơn chút điều này sẽ tàn phá khung dữ liệu hoàn chỉnh (DF của tôi có 1000 cột)
ECII

8
sau đó chỉ cần sử dụngdata[,c(ncol(data),1:(ncol(data)-1))]
Rentrop

Chính xác những gì tôi đang tìm kiếm. Tôi đã phải di chuyển 8 cột cuối cùng ở đầu 33 cột khác và tôi đã sử dụng. expr <- expr1 [, c (33: 40,1: (32))] Cảm ơn!
Urvah Shabbir

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

điều này sẽ di chuyển cột cuối cùng của bạn, tức là cột thứ 1000 sang cột đầu tiên.


19

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"))]

2
Đây là một cách dễ dàng câu trả lời tốt nhất ở đây
Neal Barsch

1
Điều này dường như không hoạt động khi cột được đặt tên là một yếu tố có thứ tự.
DLyons

11

dplyr 1.0.0bâ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 .beforehoặ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

4

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)]

1

Di chuyển bất kỳ cột nào từ bất kỳ vị trí nào cho vị trí đầu tiên trong dữ liệu của bạn

n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.