计算每组观察/行数,并将结果添加到数据框

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)

现在我想计算每个组合的观察次数nametype.这可以这样做:

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)


jor*_*ran 7

你可以这样做:

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