You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:39:13