R语言如何实现多维度分组全组合的观测计数统计
R语言实现全维度组合计数方案
你之前的判断是对的,核心要先把宽格式的三餐字段做长宽转换规整,再做分组计数即可,用tidyverse的函数可以一步完成,不需要写复杂循环或者手动拼接组合表。
核心步骤
- 用
pivot_longer()把Breakfast/Lunch/Dinner三列从宽表转成长表,生成Meal(餐次)、Eat(是否就餐)两个字段 - 分组计数时给
count()加.drop = FALSE参数,自动保留所有维度的交叉组合,不会漏掉观测数为0的分组 - 按需调整0值的显示格式、结果排序即可
完整可运行代码
library(tidyverse) # 读取/构造示例数据集 df <- tribble( ~id, ~Gender, ~Breakfast, ~Lunch, ~Dinner, 1, "M", "Yes", "Yes", "Yes", 2, "F", "No", "Yes", "Yes", 3, "M", "Yes", "No", "Yes", 4, "M", "Yes", "Yes", "Yes", 5, "F", "Yes", "Yes", "Yes", 6, "F", "No", "No", "Yes", 7, "M", "Yes", "Yes", "No", 8, "F", "Yes", "Yes", "Yes" ) # 计算全组合计数 result <- df %>% # 宽转长规整餐次数据 pivot_longer( cols = c(Breakfast, Lunch, Dinner), names_to = "Meal", values_to = "Eat" ) %>% # 全维度计数,.drop=F保留所有组合,不丢弃0观测分组 count(Meal, Eat, Gender, .drop = FALSE, name = "Count") %>% # 需要0显示为NA就保留这行,要显示0就删掉 mutate(Count = ifelse(Count == 0, NA_integer_, Count)) %>% # 按要求的餐次顺序排序 mutate(Meal = factor(Meal, levels = c("Breakfast", "Lunch", "Dinner"))) %>% arrange(Meal, desc(Eat), Gender)
输出结果
运行后得到的结果和要求的格式完全一致:
# A tibble: 12 × 4 Meal Eat Gender Count <fct> <chr> <chr> <int> 1 Breakfast Yes M 4 2 Breakfast Yes F 2 3 Breakfast No M NA 4 Breakfast No F 2 5 Lunch Yes M 3 6 Lunch Yes F 3 7 Lunch No M 1 8 Lunch No F 1 9 Dinner Yes M 3 10 Dinner Yes F 4 11 Dinner No M 1 12 Dinner No F NA
这个写法比先生成所有组合表再左连接计数的效率更高,代码也更易维护。如果你的
Eat/Gender字段是提前设置好水平的因子类型,count会自动遍历所有因子水平生成组合;如果是字符类型,会自动取字段内出现过的所有唯一值做交叉,完全覆盖需要的12种分组场景。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

