1. ホーム
  2. r

dplyrフィルター。変数の最小値を持つ行を取得するが、最小値が複数ある場合は最初の行のみ取得する

2023-10-26 02:48:38

質問

を使ってグループ化されたフィルタを作りたいのですが dplyr の最小値を持つ行だけが返されるようにします。 x .

私の問題点は 予想通り、複数の極小値を持つ場合 すべて の行が返されます。しかし、私の場合は 最初の行だけが欲しいのです。 というように、複数の最小値が存在する場合は

以下はその例です。

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

Q: dplyrでこれにアプローチする方法はありますか? (速度の理由から)

どのように解決するのですか?

念のため。ここで、最終的な dplyr の最終的な解決策です。

library(dplyr)
df.g <- group_by(df, A)
filter(df.g, rank(x, ties.method="first")==1)