2012-02-19 10 views
18

Tôi có khung dữ liệu df với cột ID, ví dụ: A, B, v.v. Tôi cũng có một vector chứa một số ID nhất định:Lọc khung dữ liệu trên một vector

L <- c("A", "B", "E") 

Làm cách nào để lọc khung dữ liệu để chỉ nhận các ID có trong vectơ? Cá nhân, tôi sẽ sử dụng

subset(df, ID == "A") 

nhưng làm cách nào để lọc trên toàn bộ véc tơ?

Trả lời

35

Bạn có thể sử dụng %in% điều hành:

> df <- data.frame(id=c(LETTERS, LETTERS), x=1:52) 
> L <- c("A","B","E") 
> subset(df, id %in% L) 
    id x 
1 A 1 
2 B 2 
5 E 5 
27 A 27 
28 B 28 
31 E 31 

Nếu ID của bạn là duy nhất, bạn có thể sử dụng match():

> df <- data.frame(id=c(LETTERS), x=1:26) 
> df[match(L, df$id), ] 
    id x 
1 A 1 
2 B 2 
5 E 5 

hoặc làm cho họ rownames của dataframe và chiết xuất của bạn bằng cách hàng:

> rownames(df) <- df$id 
> df[L, ] 
    id x 
A A 1 
B B 2 
E E 5 

Cuối cùng, đối với nhiều người dùng tiên tiến, và nếu tốc độ là một mối quan tâm, tôi muốn khuyên bạn nên nhìn vào gói data.table.

+1

Để hoàn thành: Bạn cũng có thể sử dụng 'df [id% trong% L,]' – JaKu

1

Tôi cho rằng bạn cần phải sử dụng 'kết hợp'. Nó khớp với các giá trị trong một vector với các giá trị trong một véc-tơ khác, và cho NA nơi không có kết quả phù hợp. Vì vậy, sau đó bạn tập hợp con dựa trên! Is.na của trận đấu.

Thấy không? Trận đấu và có thể bạn có thể làm việc nó ra cho chính mình, trong trường hợp này bạn sẽ học được nhiều hơn từ những câu trả lời chính xác ai đó sẽ làm trong thời gian ngắn mà sẽ chỉ khuyến khích bạn cắt n dán :)