R 按组将唯一/不同值的计数添加到原始数据中

R 按组将唯一/不同值的计数添加到原始数据中,r,count,unique,aggregate,R,Count,Unique,Aggregate,我希望通过对第二个变量进行分组来计算唯一值的数量,然后将该数量作为新列添加到现有的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 我想为每种颜色添加数据中存在的唯一类型的计数:

我希望通过对第二个变量进行分组来计算唯一值的数量,然后将该数量作为新列添加到现有的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  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,但似乎找不到一种不需要很多行的简单方法。我有超过100000行,所以我也不确定效率有多重要

这有点类似于此问题:

使用ave,因为您特别要求:

within(df, { count <- ave(type, color, FUN=function(x) length(unique(x)))})
uniqueN在v1.9.6中实现,是lengthunique的一个更快的等价物。。此外,它还适用于data.frames/data.tables

其他解决办法:

使用plyr:

require(plyr)
ddply(df, .(color), mutate, count = length(unique(type)))
使用聚合:


这里有一个包的解决方案-它有n_distinct作为lengthunique的包装


这也可以通过将unique与table或TABLATE相结合,在无需分组操作的矢量化中实现

如果df$color是因子,则

或者

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 

如果df$color是字符,那么

table(unique(df)$color)[df$color]
tabulate(unique(df)$color)[df$color]
如果df$color是一个整数,那么

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

如果没有NA值,则在plyr版本中使用lengthuniquetype仅等效于data.table::uniqueNtype。uniqueN将为空组报告0,而lengthuniquetype将为1!dplyr不确定数据的plyr等效值。table::uniqueNx,na.rm=TRUE是dplyr::n_distinctx,na.rm=TRUE感谢dplyr解决方案Sam。假设我想更进一步,将df子集仅包括颜色和相应数量的不同类型。我记得有一个光滑的功能,但我不记得了,建议?
table(unique(df)$color)[df$color]
tabulate(unique(df)$color)[df$color]