2012-03-16 57 views
13

Tôi hiểu làm thế nào để sắp xếp một khung dữ liệu:Cách sắp xếp và lọc data.frame trong R?

df[order(df$Height),]

và tôi hiểu làm thế nào để lọc (hoặc tập hợp con) một khung dữ liệu phù hợp với một số vị:

df[df$Weight > 120,]

nhưng làm cách nào để sắp xếp bộ lọc (ví dụ: đặt hàng theo Chiều cao và lọc theo Trọng lượng)?

Trả lời

14

Hoặc theo hai bước

df1 <- df[df$weight > 120, ] 
df2 <- df1[order(df1$height), ] 

hoặc nếu bạn phải trong một bước - nhưng nó thực sự không phải là bất kỳ sạch.

dữ liệu đầu tiên:

R> set.seed(42) 
R> df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20)) 
R> df 
    weight height 
1 133.7 186.1 
2 114.4 205.7 
3 123.6 132.2 
4 126.3 154.4 
5 124.0 157.3 
6 118.9 172.7 
7 135.1 154.3 
8 119.1 106.9 
9 140.2 111.2 
10 119.4 186.4 

Và một cách để làm việc đó là đôi Subsetting:

R> subset(df, weight > 120)[order(subset(df, weight > 120)$height),] 
    weight height 
9 140.2 111.2 
3 123.6 132.2 
7 135.1 154.3 
4 126.3 154.4 
5 124.0 157.3 
1 133.7 186.1 
R> 

Tôi muốn đi với hai bước.

+0

Chỉ vì tò mò, tại sao 'set.seed (42)'? – kohske

+0

Tôi muốn sử dụng 'reshape2 :: sắp xếp (tập hợp con (df, weight> 120), height)' – baptiste

+0

Tôi đã chờ đợi các Hadley-isms thích hợp :-) –

11

Gói data.table cho phép bạn điều này trong một dòng mã ngắn:

Vay dụ Dirk Eddelbuettel của, thiết lập một số dữ liệu:

set.seed(42) 
df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20)) 

Chuyển đổi data.frame đến một data.table và tập hợp con tăng cân, đặt hàng theo chiều cao:

library(data.table) 
dt <- data.table(df) 

dt[weight>120][order(height)] 

     weight height 
[1,] 140.1842 111.1907 
[2,] 123.6313 132.2228 
[3,] 135.1152 154.3149 
[4,] 126.3286 154.4242 
[5,] 124.0427 157.3336 
[6,] 133.7096 186.0974 
+0

Rất đẹp. Có, đây là một trong những tính năng tiện lợi chính của 'data.table'. Tôi tự hỏi nếu người dùng mới nghĩ rằng họ phải chuyển đổi tất cả thời gian để sử dụng 'data.table', mặc dù? Trong trường hợp này, và nhiều trường hợp khác, lệnh gọi 'data.frame()' có thể được thay thế bằng 'data.table()' và không cần phải chuyển đổi khi bắt đầu bằng 'data.table' ở vị trí đầu tiên. Tôi biết bạn biết điều này, nó chỉ là một câu hỏi tiếp thị thực sự. –

2
df1 <- df[order(df$height), ][df$weight > 120, ] 

Chỉ cần đảm bảo đặt hàng trước bộ lọc.

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