【发布时间】:2012-04-01 14:59:00
【问题描述】:
我了解如何对数据框进行排序:
df[order(df$Height),]
我了解如何过滤(或子集)匹配某个谓词的数据框:
df[df$Weight > 120,]
但是我如何对 和 过滤器进行排序(例如,按高度排序并按重量过滤)?
【问题讨论】:
标签: r sorting dataframe subset
我了解如何对数据框进行排序:
df[order(df$Height),]
我了解如何过滤(或子集)匹配某个谓词的数据框:
df[df$Weight > 120,]
但是我如何对 和 过滤器进行排序(例如,按高度排序并按重量过滤)?
【问题讨论】:
标签: r sorting dataframe subset
df1 <- df[order(df$height), ][df$weight > 120, ]
只需确保将订单放在过滤器之前。
【讨论】:
data.table 包允许您在一行短代码中完成此操作:
借用 Dirk Eddelbuettel 的例子,设置一些数据:
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
【讨论】:
data.table 的主要便利功能之一。我想知道新用户是否认为他们必须一直转换才能使用data.table?在这种情况下,以及许多其他情况下,对data.frame() 的调用可以替换为data.table(),并且首先以data.table 开头时无需转换。我知道你知道这一点,这真的只是一个营销问题。
分两步
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>
我会分两步走。
【讨论】:
set.seed(42)?
reshape2::arrange(subset(df, weight > 120), height)
42,而不是1 或2。