【发布时间】:2014-02-14 00:23:51
【问题描述】:
我想使用dplyr 创建一个分组过滤器,在每个组内只返回具有变量x 最小值的行。
我的问题是:正如预期的那样,在多个最小值的情况下 all 具有最小值的行被返回。但就我而言,如果存在多个最小值,我只想要第一行。
这是一个例子:
df <- data.frame(
A=c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
x=c(1, 1, 2, 2, 3, 4, 5, 5, 5),
y=rnorm(9)
)
library(dplyr)
df.g <- group_by(df, A)
filter(df.g, x == min(x))
正如所料,所有最小值都返回:
Source: local data frame [6 x 3]
Groups: A
A x y
1 A 1 -1.04584335
2 A 1 0.97949399
3 B 2 0.79600971
4 C 5 -0.08655151
5 C 5 0.16649962
6 C 5 -0.05948012
使用 ddply,我会以这种方式处理任务:
library(plyr)
ddply(df, .(A), function(z) {
z[z$x == min(z$x), ][1, ]
})
...有效:
A x y
1 A 1 -1.04584335
2 B 2 0.79600971
3 C 5 -0.08655151
问:有没有办法在 dplyr 中解决这个问题?(出于速度原因)
【问题讨论】:
-
filter(df.g, rank(x) == 1)? -
@FelixS,
rank(x)==1是否给出了预期的结果? -
@hadley, 1) 我不认为
min_rank在这里有帮助。他需要第一个最小值(查看plyr解决方案)。 2) 无论您编写何种编程语言,rank的算法复杂度(ties=min、max、first 等)都将比仅计算min更大。 -
@Arun:没错,只有
rank(x, ties.method="first")==1有效,因为 min 和 min_rank 不区分多个最小值。 -
@hadley,我仍然不明白这如何让您认为
which.min是过早的优化。 AFAIK 这是一个自然的选择,读起来好,容易理解,快,因为它也恰好是 O(n)。