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

R语言条件分组:仅特定子集按den_status分组并应用mod.zscore

条件分组应用自定义函数的R实现

方法一:单语句动态分组(推荐)

直接在group_by中通过临时分组键实现条件逻辑,无需拆分数据集,代码简洁且不修改原列:

library(dplyr)

# 处理数据集
df_processed <- df %>%
  group_by(
    sex, age_class, season,
    # 仅符合指定条件时用den_status分组,其余情况统一分组
    den_status = if_else(sex == 'F' & age_class == 'A' & season == 'spring', 
                        den_status, "temp_unified_group")
  ) %>%
  # 对albumin至insulin列应用自定义函数生成zscore
  mutate(across(albumin:insulin, mod.zscore, .names = "{.col}_zscore")) %>%
  ungroup()

逻辑说明:

  • 分组时,仅当sex='F'、age_class='A'且season='spring'的行,会用原den_status值作为分组依据,实现细分;
  • 其余所有行的临时分组键设为统一值,因此只会按sex、age_class、season三个变量分组;
  • 原数据的所有列(包括den_status)完全保留,后续可正常基于这些列操作;
  • ungroup()取消分组状态,避免后续操作受分组影响。

方法二:拆分数据集分别处理(直观易调试)

如果觉得动态分组逻辑不好理解,可以把数据集拆分为符合条件和不符合条件的两部分,分别处理后合并:

library(dplyr)

# 拆分数据集
df_special <- df %>% filter(sex == 'F' & age_class == 'A' & season == 'spring')
df_other <- df %>% filter(!(sex == 'F' & age_class == 'A' & season == 'spring'))

# 处理特殊分组(包含den_status)
df_special_processed <- df_special %>%
  group_by(sex, age_class, season, den_status) %>%
  mutate(across(albumin:insulin, mod.zscore, .names = "{.col}_zscore")) %>%
  ungroup()

# 处理普通分组(不包含den_status)
df_other_processed <- df_other %>%
  group_by(sex, age_class, season) %>%
  mutate(across(albumin:insulin, mod.zscore, .names = "{.col}_zscore")) %>%
  ungroup()

# 合并结果
df_processed <- bind_rows(df_special_processed, df_other_processed)

逻辑说明:

  • 先筛选出需要细分den_status的行,单独按四个变量分组处理;
  • 剩余行按三个变量分组处理;
  • 合并后的数据保留所有原列,满足后续操作需求。

注意事项

  • 确保自定义函数mod.zscore能正确处理分组内的向量输入(比如返回与输入等长的zscore值);
  • 两种方法都不会新增或修改原数据列,完全符合你“无需新增额外列”的要求;
  • 最终分组数量会自动匹配你需要的9种情况,无需手动指定。

内容的提问来源于stack exchange,提问作者burphound

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:22:47