Как отсортировать и отфильтровать data.frame в R? - PullRequest
14 голосов
/ 16 марта 2012

Я понимаю, как сортировать фрейм данных:

df[order(df$Height),]

и я понимаю, как фильтровать (или подмножество) кадр данных, соответствующий некоторому предикату:

df[df$Weight > 120,]

но как мне отсортировать и фильтр (например, порядок по высоте и фильтр по весу)?

Ответы [ 3 ]

14 голосов
/ 16 марта 2012

Либо в два этапа

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

, либо, если необходимо, в один шаг - но это на самом деле не чище.

Сначала данные:

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

И один из способов сделать это - двойное подмножество:

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> 

Я бы пошел с двумя шагами.

12 голосов
/ 16 марта 2012

Пакет data.table позволяет сделать это в одной короткой строке кода:

Пример заимствования Дирка Эддельбюттеля, настройте некоторые данные:

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

Преобразование data.frame в data.table и подмножество по весу, упорядочение по росту:

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
6 голосов
/ 05 апреля 2016
df1 <- df[order(df$height), ][df$weight > 120, ]

Просто убедитесь, что поставили заказ перед фильтром.

...