如何在R中对不同age_group的variant差异化设置prob_diff列值?
差异化处理概率差计算中的NA值
问题说明
age_group为双水平因子,variant是在不同age_group中数量不同的因子,prob对应各age_group下variant的概率。示例数据:
dat = tribble( ~age_group, ~variant, ~prob, "< 30", "Frohes neues Jahr", 0.429, "< 30", "Gutes neues Jahr", 0.143, "< 30", "Prosit Neujahr", 0.429, "> 50", "Frohes neues Jahr", 0.1, "> 50", "Gesundes neues Jahr", 0.1, "> 50", "Gutes neues Jahr", 0.2, "> 50", "Prosit Neujahr", 0.6 )
需要计算不同age_group间对应variant的概率差,同时对prob_diff列的NA值做差异化处理:
- 仅在单个
age_group中存在的variant,将prob_diff设为1; - 在两个
age_group中都存在的variant,保留原计算逻辑产生的NA。
解决方案
可以通过分组后判断分组大小,结合条件赋值实现需求,代码如下:
library(dplyr) dat %>% group_by(variant) %>% # 按age_group排序,保证差值计算顺序统一 arrange(age_group) %>% mutate( prob_diff = case_when( # 单个age_group存在的variant,直接赋值1 n() == 1 ~ 1, # 双age_group存在的,计算差值并在组末保留NA n() == 2 ~ c(prob[2] - prob[1], NA) ) ) %>% relocate(prob_diff, .after = prob) %>% ungroup()
代码逻辑说明
- 分组与排序:按
variant分组,对组内age_group排序,确保差值计算顺序固定(如统一用>50组概率减去<30组概率); - 条件赋值:
- 用
n()判断当前variant的记录数,记录数为1时直接赋值1; - 记录数为2时,计算两组概率差,并在组内最后一行保留NA,与原逻辑匹配;
- 用
- 列位置调整:通过
relocate将prob_diff移到prob列之后,便于对应查看。
运行后,Gesundes neues Jahr对应的prob_diff会被设为1,其余存在双组的variant将显示概率差,组内最后一行保留NA。
内容的提问来源于stack exchange,提问作者Mason Wirtz
相关产品推荐
相关产品推荐

