Uri*_*son 46 aggregate r count r-faq
说我有一个data.frame对象:
df <- data.frame(name=c('black','black','black','red','red'),
type=c('chair','chair','sofa','sofa','plate'),
num=c(4,5,12,4,3))
Run Code Online (Sandbox Code Playgroud)
现在我想计算每个组合的观察次数name和type.这可以这样做:
table(df[ , c("name","type")])
Run Code Online (Sandbox Code Playgroud)
或者也可能plyr,(虽然我不确定如何).
但是,如何将结果合并到原始数据框中?这样结果将如下所示:
df
# name type num count
# 1 black chair 4 2
# 2 black chair 5 2
# 3 black sofa 12 1
# 4 red sofa 4 1
# 5 red plate 3 1
Run Code Online (Sandbox Code Playgroud)
这里count现在存储从聚集的结果.
一个解决方案plyr也可能很有趣,但我希望看到这是如何用基础R完成的.
Ram*_*ath 58
使用plyr:
plyr::ddply(df, .(name, type), transform, count = length(num))
Run Code Online (Sandbox Code Playgroud)
使用data.table:
library(data.table)
dt = data.table(df)
# using setkey or setkeyv to set the key
setkeyv(dt, c('name', 'type'))
# self
dt[dt[ , count = length(num), 'name, type']]
Run Code Online (Sandbox Code Playgroud)
编辑(mnel)
使用data.table1.8.2或更高版本具有:=分组功能.还有值.N (引入版本1.6.2),这是组中的行数),因此它很简单
dt[ , count := .N, by = list(name, type)]
Run Code Online (Sandbox Code Playgroud)
使用dplyr:
library(dplyr)
df %>%
group_by(name, type) %>%
mutate(count = n())
Run Code Online (Sandbox Code Playgroud)
或者干脆:
add_count(df, name, type)
Run Code Online (Sandbox Code Playgroud)
Jos*_*ich 26
你可以使用ave:
df$count <- ave(df$num, df[,c("name","type")], FUN=length)
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
> ddply(df,.(name,type),transform,count = NROW(piece))
name type num count
1 black chair 4 2
2 black chair 5 2
3 black sofa 12 1
4 red plate 3 1
5 red sofa 4 1
Run Code Online (Sandbox Code Playgroud)
或者更直观地说,
> ddply(df,.(name,type),transform,count = length(num))
name type num count
1 black chair 4 2
2 black chair 5 2
3 black sofa 12 1
4 red plate 3 1
5 red sofa 4 1
Run Code Online (Sandbox Code Playgroud)
小智 5
这应该做你的工作:
df_agg <- aggregate(num~name+type,df,FUN=NROW)
names(df_agg)[3] <- "count"
df <- merge(df,df_agg,by=c('name','type'),all.x=TRUE)
Run Code Online (Sandbox Code Playgroud)