Trích xuất các cột cụ thể từ khung dữ liệu


365

Tôi có khung dữ liệu R với 6 cột và tôi muốn tạo một khung dữ liệu mới chỉ có ba trong số các cột.

Giả sử khung dữ liệu của tôi là df, và tôi muốn cột trích A, BE, đây là chỉ huy tôi có thể hình dung ra:

 data.frame(df$A,df$B,df$E)

Có cách nào nhỏ gọn hơn để làm điều này?

Câu trả lời:


156

Sử dụng gói dplyr , nếu data.frame của bạn được gọi df1:

library(dplyr)

df1 %>%
  select(A, B, E)

Điều này cũng có thể được viết mà không có %>%đường ống như:

select(df1, A, B, E)

2
Với sự phát triển đáng kể của Tidyverse kể từ khi đăng câu hỏi của tôi, tôi đã chuyển câu trả lời cho bạn.
Aren Camename

4
Với tỷ lệ thay đổi dữ dội trong ngăn xếp, tôi sẽ thận trọng không sử dụng mô hình này. Điều này ngoài sở thích mạnh mẽ của tôi đối với việc xử lý các tên cột như thể chúng là tên đối tượng khi viết mã cho các hàm, gói hoặc ứng dụng.
Joshua Ulrich

1
Đã hơn bốn năm kể từ khi câu trả lời này được gửi và mô hình đã không thay đổi. Biểu thức đường ống có thể khá trực quan, đó là lý do tại sao chúng hấp dẫn.
Aren Camename

Làm thế nào để tôi thực hiện một lệnh tiếp theo vào tập hợp con này? Ví dụ: tôi muốn tính toán rowMean: "df1%>% rowMeans (select (A, B, E))" không hoạt động.
Bến

Bạn sẽ xâu chuỗi một đường ống như : df1 %>% select(A, B, E) %>% rowMeans(.). Xem tài liệu về %>%đường ống bằng cách gõ?magrittr::`%>%`
Sam Firke

448

Bạn có thể tập hợp con bằng cách sử dụng một vectơ tên cột. Tôi đặc biệt thích cách tiếp cận này hơn các cách xử lý tên cột như thể chúng là tên đối tượng (ví dụ subset()), đặc biệt là khi lập trình trong các hàm, gói hoặc ứng dụng.

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]

4
Điều đó cho lỗi object of type 'closure' is not subsettable.
Aren Camename

24
@ArenCambre: thì data.frame của bạn không thực sự được đặt tên df. dfcũng là một chức năng trong gói số liệu thống kê.
Joshua Ulrich


2
@Cina: Vì -"A"là lỗi cú pháp. Và ?Extractnói, " , cũng có thể là số nguyên âm, cho thấy yếu tố / lát rời ra khỏi sự lựa chọn." ij...
Joshua Ulrich

7
Có một vấn đề với cú pháp này bởi vì nếu chúng tôi chỉ trích xuất một cột R, trả về một vectơ thay vì một khung dữ liệu và điều này có thể không mong muốn : > df[,c("A")] [1] 1. Sử dụng subsetkhông có nhược điểm này.
David Dorchies

100

Đây là vai trò của subset()chức năng:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4

Khi tôi thử điều này, với dữ liệu của mình, tôi gặp lỗi: "Lỗi trong x [j]: loại đăng ký không hợp lệ 'list'" Nhưng nếu c ("A", "B") không phải là danh sách, thì đó là gì ?
Rafael_Espericueta

@Rafael_Espericueta Khó đoán mà không xem mã của bạn ... Nhưng c("A", "B")là một vectơ, không phải là một danh sách.
Stéphane Laurent

Nó chuyển đổi khung dữ liệu thành danh sách.
Suat Atan Tiến sĩ

78

Có hai sự lựa chọn rõ ràng: Joshua Ulrich's df[,c("A","B","E")]hoặc

df[,c(1,2,5)]

như trong

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8

16

Vì một số lý do

df[, (names(df) %in% c("A","B","E"))]

đã làm cho tôi. Tất cả các cú pháp trên mang lại "các cột không xác định được chọn".



14

Bạn cũng có thể sử dụng sqldfgói thực hiện các lựa chọn trên các khung dữ liệu R như:

df1 <- sqldf("select A, B, E from df")

Điều này cung cấp cho đầu ra một khung dữ liệu df1với các cột: A, B, E.



1
df<- dplyr::select ( df,A,B,C)

Ngoài ra, bạn có thể gán tên khác cho dữ liệu vừa tạo

data<- dplyr::select ( df,A,B,C)

0

[ và tập hợp con không thể thay thế:

[ không trả về một vectơ nếu chỉ có một cột được chọn.

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)

4
Không, nếu bạn đặt drop=FALSE. Ví dụ:df[,c("a"),drop=F]
cho đế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.