1. ホーム
  2. r

元データにグループごとのユニーク値/明確値のカウントを追加する

2023-08-01 20:03:06

質問

2番目の変数のグループ化によってユニークな値の数をカウントし、そのカウントを新しい列として既存のdata.frameに追加したいのです。例えば、既存のデータフレームが以下のような場合です。

  color  type
1 black chair
2 black chair
3 black  sofa
4 green  sofa
5 green  sofa
6   red  sofa
7   red plate
8  blue  sofa
9  blue plate
10 blue chair

それぞれの color に対して、ユニークな types の数です。

  color  type unique_types
1 black chair            2
2 black chair            2
3 black  sofa            2
4 green  sofa            1
5 green  sofa            1
6   red  sofa            2
7   red plate            2
8  blue  sofa            3
9  blue plate            3
10 blue chair            3

を使いたかったのですが ave を使いたかったのですが、何行も必要としない簡単な方法が見つからないようです。私は10万行あるので、効率がどの程度重要なのかもよくわかりません。

この問題と多少似ています。 グループごとの観測値/行数をカウントし、結果をデータフレームに追加する

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

使用方法 ave (を使用します(具体的に要求されているので)。

within(df, { count <- ave(type, color, FUN=function(x) length(unique(x)))})

必ず type が文字ベクトルであり、因子でないことを確認してください。


データが巨大で、そのため速度/性能が要因になる可能性があるとも言っているので、私なら data.table のソリューションもお勧めします。

require(data.table)
setDT(df)[, count := uniqueN(type), by = color] # v1.9.6+
# if you don't want df to be modified by reference
ans = as.data.table(df)[, count := uniqueN(type), by = color]

uniqueN が実装されていたのは v1.9.6 と同等であり、より高速な length(unique(.)) . さらに、data.frames/data.tablesでも動作します。


他の解決策

plyrを使用する。

require(plyr)
ddply(df, .(color), mutate, count = length(unique(type)))

使用方法 aggregate :

agg <- aggregate(data=df, type ~ color, function(x) length(unique(x)))
merge(df, agg, by="color", all=TRUE)