2012-04-10 37 views
250

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 cột.Trích xuất các cột cụ thể từ một khung dữ liệu

Giả khung dữ liệu của tôi là df, và tôi muốn trích xuất cột A, B, và E, đây là lệnh duy nhất tôi có thể hình dung ra:

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

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

Trả lời

342

Có, có.

# 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")] 
+2

Điều đó cho lỗi 'đối tượng thuộc loại' đóng 'không được đặt trước'. –

+19

@ArenCambre: sau đó data.frame của bạn không thực sự được đặt tên là 'df'. 'df' cũng là một hàm trong gói thống kê. –

+4

@ArenCambre: http://2.bp.blogspot.com/-XU9PduVhq-I/Um-Y6e19jZI/AAAAAAAADfI/PrmoFQexa5M/s1600/Book+last+page.jpg –

42

Có hai sự lựa chọn rõ ràng: Joshua Ulrich của 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 
70

Đâ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 
+0

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 chỉ số không hợp lệ 'danh sách'" Nhưng nếu c ("A", "B") không phải là danh sách , nó là gì? –

+0

@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à danh sách. –

+0

Nó chuyển đổi khung dữ liệu thành danh sách. –

28

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

library(dplyr) 

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

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

select(df1, A, B, E) 
6

Một lần nữa sử dụng dplyr, nơi df1 là khung dữ liệu ban đầu của bạn:

df2 <- subset(df1, select = c(1, 2, 5)) 
+3

Điều này không sử dụng 'dplyr'. Nó sử dụng 'base :: subset', và giống hệt với câu trả lời của [Stephane Laurent] (https://stackoverflow.com/a/10086494/903061) ngoại trừ việc bạn sử dụng số cột thay vì tên cột. – Gregor

0

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

[ không trả lại một véc tơ 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")) 
) 
+0

Không nếu bạn đặt 'drop = FALSE'. Ví dụ: 'df [, c (" a "), drop = F]' – untill

6

Bạn cũng có thể sử dụng gói sqldf mà thực hiện Selects trên khung R dữ liệu như:

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

Điều này cho phép chế độ xuất ra một khung dữ liệu df1 với các cột: A, B, E.

2

Đối với một số lý do duy nhất

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

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

Các vấn đề liên quan