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
(因为您特别要求它):

uniqueN
是在
v1.9.6
中实现的,它是
长度(唯一()
的一个更快的等价物。此外,它还适用于data.frames/data.tables


其他解决办法:

使用plyr:

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

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

agg这个包有一个解决方案-它有
n_distinct()
作为
length(unique())
的包装


这也可以通过将
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
character
,那么

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]

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