78

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

for each 、データに存在する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たが、多くの行を必要としない簡単な方法が見つからないようです。私は 100,000 行を超えているため、効率がどれほど重要かもわかりません。

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

4

3 に答える 3

78

使用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 でも​​動作します。


その他の解決策:

プライアの使用:

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)
于 2013-07-02T09:24:36.810 に答える
9

これはuniquetableまたはtabulate

df$colorの場合factor

また

table(unique(df)$color)[as.character(df$color)]
# black black black green green   red   red  blue  blue  blue 
#    2     2     2     1     1     2     2     3     3     3 

または

tabulate(unique(df)$color)[as.integer(df$color)]
# [1] 2 2 2 1 1 2 2 3 3 3

もしそうdf$colorならcharacter

table(unique(df)$color)[df$color]

もしそうdf$colorならinteger

tabulate(unique(df)$color)[df$color]
于 2016-03-24T11:27:57.807 に答える