如何用case_when结合Flag=1时Z的中位数创建分类变量?
用case_when实现分类变量NewCol的生成
核心思路
先计算Flag=1分组下Z的中位数,再通过case_when按规则匹配分类结果。
方案一:高效实现(推荐)
先一次性计算中位数并存储为临时列,再用该列做判断,避免重复计算:
library(dplyr) # 假设数据集名为df df <- df %>% # 计算Flag=1对应的Z的中位数,生成临时列 mutate(flag1_z_median = median(Z[Flag == 1], na.rm = TRUE)) %>% # 按规则生成NewCol mutate(NewCol = case_when( Flag == 2 ~ "Flag2", Flag == 1 & Z >= flag1_z_median ~ "GT EQ Median", Flag == 1 & Z < flag1_z_median ~ "LT Median", # 处理其他未匹配的Flag值(按需调整) TRUE ~ NA_character_ )) %>% # 移除临时中位数列(可选) select(-flag1_z_median)
方案二:简化写法(适合小数据集)
直接在case_when中嵌入中位数计算,代码更简洁但会重复计算中位数,大数据集效率较低:
library(dplyr) df <- df %>% mutate(NewCol = case_when( Flag == 2 ~ "Flag2", Flag == 1 & Z >= median(Z[Flag == 1], na.rm = TRUE) ~ "GT EQ Median", Flag == 1 & Z < median(Z[Flag == 1], na.rm = TRUE) ~ "LT Median", TRUE ~ NA_character_ ))
注意事项
- 加上
na.rm = TRUE是为了忽略Z列中的缺失值,避免中位数计算报错,可根据实际数据情况调整。 - 如果数据中存在Flag既不是1也不是2的情况,最后一行
TRUE ~ NA_character_会将这些行的NewCol设为缺失值,可根据需求修改默认值。
内容的提问来源于stack exchange,提问作者Emily Fassbender
相关产品推荐
相关产品推荐

