如何按组计算唯一值的数量?

36
ID= c('A', 'A', 'A', 'B', 'B', 'B')
color=c('white', 'green', 'orange', 'white', 'green', 'green')

d = data.frame (ID, color)

我希望的结果是

unique_colors=c(3,3,3,2,2,2)
d = data.frame (ID, color, unique_colors)

或者在一个新的数据框 c 中更清晰地表示。

ID= c('A','B')
unique_colors=c(3,2)
c = data.frame (ID,unique_colors)

我已尝试使用不同的aggregateave组合,以及bywith,我认为它是这些函数的组合。

解决方案将包括:

length(unique(d$color))

计算唯一元素的数量。


1
请参见此处,(那个问题上有一个相似的标题...你发帖前搜索了吗?)以获取更多可能性。 - Henrik
1个回答

95

我认为你对此完全搞错了。使用 data.table 时既不需要 plyr,也不需要 <-

最近的版本 data.table,v >= 1.9.6,有一个新函数 uniqueN() 就是为了这个。

library(data.table) ## >= v1.9.6
setDT(d)[, .(count = uniqueN(color)), by = ID]
#    ID count
# 1:  A     3
# 2:  B     2

如果您想创建一个包含计数的新列,请使用:=运算符

setDT(d)[, count := uniqueN(color), by = ID]
或者使用dplyr库中的n_distinct函数。
library(dplyr)
d %>%
  group_by(ID) %>%
  summarise(count = n_distinct(color))
# Source: local data table [2 x 2]
# 
#   ID count
# 1  A     3
# 2  B     2

或者(如果您想要一个新的列)使用mutate代替summary

d %>%
  group_by(ID) %>%
  mutate(count = n_distinct(color))

1
一个简单的函数可以是 with(d, ave(as.numeric(color), ID, FUN=function(x) length(unique(x)))) - akrun
@akrun,你可以将这个作为另一种选择发布。 - David Arenburg
@DavidArenburg,或许我错过了一些显而易见的东西,但是我正在尝试使用最新版本的data.table中的uniqueN函数,但它说该包不存在。你有什么想法吗? - MatthewR
@MatthewR 是的,正如我所提到的,这个函数只存在于 GitHub 的开发版本中。请跟随我提供的链接。 - David Arenburg
这也可以运行: d %>% group_by(ID) %>% mutate(count = n()) - aliawadh980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接