3 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
我希望使用一種分組過濾器dplyr,在每個(gè)組中只返回具有最小變量值的行x。
我的問題是:正如預(yù)期的那樣,在多個(gè)最小值的情況下,返回具有最小值的所有行。但在我的情況下,如果存在多個(gè)最小值,我只想要第一行。
這是一個(gè)例子:
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,我會(huì)以這種方式接近任務(wù):
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中解決這個(gè)問題?(出于速度原因)

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
只是為了完整性:這是最終dplyr解決方案,源自@hadley和@Arun的評(píng)論:
library(dplyr)
df.g <- group_by(df, A)
filter(df.g, rank(x, ties.method="first")==1)

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于data.table那些可能感興趣的人來說,這是一個(gè)解決方案:
# approach with setting keys
dt <- as.data.table(df)
setkey(dt, A,x)
dt[J(unique(A)), mult="first"]
# without using keys
dt <- as.data.table(df)
dt[dt[, .I[which.min(x)], by=A]$V1]
- 3 回答
- 0 關(guān)注
- 759 瀏覽
添加回答
舉報(bào)