R语言如何计算数据框中每个ID对应不同事件数的平均值
问题背景
现有如下R数据框d:
d <- data.frame(ID = c("a","a","a","a","a","a","b","b"), event = c("G12","R2","O99","B4","B4","A24","L5","J15"), stringsAsFactors=FALSE)
数据共包含2个由ID标识的主体,每个主体对应多条event记录:ID=a共有6条event记录,其中唯一值共5条;ID=b共有2条event记录,全部为唯一值。
需求
计算数据集中每个主体对应的唯一event数量的平均值,示例数据的期望计算结果为:(5+2)/2 = 3.5。
现有方案问题
尝试运行如下代码时报错:
d %>% group_by(ID) %>% summarise(mean = mean(tally(unique(event))))
解决方案
错误原因
tally()是用于统计分组观测行数的函数,仅接受数据集作为输入,传入向量unique(event)会触发类型错误。统计分组内唯一值数量可直接使用dplyr内置的n_distinct()函数。
可行实现
方案1:tidyverse 实现
library(dplyr) # 先分组计算每个ID的唯一event数,再求平均 d %>% group_by(ID) %>% summarise(uniq_event = n_distinct(event)) %>% pull(uniq_event) %>% mean()
也可以合并为一步输出汇总结果:
d %>% group_by(ID) %>% summarise(uniq_event = n_distinct(event)) %>% summarise(avg_uniq_event = mean(uniq_event))
方案2:base R 实现
mean(tapply(d$event, d$ID, function(x) length(unique(x))))
两种方案运行后均可得到期望结果3.5。
内容的提问来源于stack exchange,提问作者logjammin
相关产品推荐
相关产品推荐

