提问者:小点点

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


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

这有点类似于这个问题:计算每组的观察数/行数并将结果添加到数据帧


共3个答案

匿名用户

这是dplyr包的一个解决方案-它有n_distinct()作为长度(唯一())的包装器。

df %>%
  group_by(color) %>%
  mutate(unique_types = n_distinct(type))

匿名用户

使用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]

uniqueNv1.9.6中实现,是长度(唯一(.))的更快等价物。此外,它还适用于data. frame/data.table。

其他解决方案:

使用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)

匿名用户

这也可以通过将唯一制表结合起来,在没有组操作的情况下在向量化中实现

如果df$颜色因子,则

要么

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$颜色字符,则只需

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

如果df$颜色整数,则只需

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