我希望通过对第二个变量进行分组来计算唯一值的数量,然后将计数作为新列添加到现有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
,但似乎找不到不需要很多行的简单方法。我有
这有点类似于这个问题:计算每组的观察数/行数并将结果添加到数据帧
这是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]
uniqueN
在v1.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]