R 按组将唯一/不同值的计数添加到原始数据中
我希望通过对第二个变量进行分组来计算唯一值的数量,然后将该数量作为新列添加到现有的data.frame中。例如,如果现有数据框如下所示: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 我想为每种颜色添加数据中存在的唯一类型的计数:
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]