Как сортировать и фильтровать data.frame в R?
Я понимаю, как сортировать фрейм данных:
df[order(df$Height),]
и я понимаю, как фильтровать (или подмножество) кадр данных, соответствующий некоторому предикату:
df[df$Weight > 120,]
но как сортировать и фильтровать (например, порядок по высоте и фильтр по весу)?
Ответы
Ответ 1
Либо в два этапа
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>
Я бы пошел с двухступенчатым.
Ответ 2
Пакет 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
Ответ 3
df1 <- df[order(df$height), ][df$weight > 120, ]
Просто поставьте заказ перед фильтром.