如何无需逐个过滤即可为所有id分组计算各variation的占比?
批量计算各id下variation的占比
你只需要在分组时同时包含id和variation,再基于id分组计算组内占比即可,无需逐个过滤id。完整代码如下:
library(dplyr) library(scales) # 构造原始数据集 c <- c(10, 20, 30, 40, 50, 40, 2, 40, 10, 50) b <- c(40, 2, 40, 10, 50, 10, 20, 30, 40, 50) a <- c(10, 50, 3, 60, 100,40, 2, 40, 10, 50) id <- c("a", "b", "b", "a", "c", "a", "b", "b", "a", "c") variation <- c("a3", "a3", "b1", "a2", "b1","a3", "a1", "b1", "a1", "b1" ) data <- data.frame(id, a, b, c, variation) # 一次性计算所有id的variation占比 data_all_percentage <- data %>% # 按id和variation组合分组,统计每组数量 group_by(id, variation) %>% count() %>% # 切换到仅按id分组,用于计算组内总数 group_by(id) %>% # 计算占比并格式化百分比标签 mutate(perc = n / sum(n), labels = percent(perc)) %>% # 按id和占比排序,提升可读性 arrange(id, perc) %>% # 取消分组(可选,根据后续操作需求) ungroup() # 查看结果 print(data_all_percentage)
执行后得到的结果:
# A tibble: 7 × 5 id variation n perc labels <chr> <chr> <int> <dbl> <chr> 1 a a1 1 0.25 25% 2 a a2 1 0.25 25% 3 a a3 2 0.5 50% 4 b a1 1 0.2 20% 5 b a3 1 0.2 20% 6 b b1 3 0.6 60% 7 c b1 2 1 100%
关键步骤说明:
group_by(id, variation):同时按用户id和变异类型分组,统计每个组合的样本数ngroup_by(id):重新分组为仅id,此时sum(n)会计算每个id对应的总样本量mutate(perc = n / sum(n)):基于每个id的总样本数,计算该id下各variation的占比scales::percent(perc):将小数占比格式化为百分比字符串,方便后续展示
内容的提问来源于stack exchange,提问作者choij
相关产品推荐
相关产品推荐

