R使用summarise生成BMI分类表返回逻辑值而非数值的解决方法
问题原因
你代码中summarise里写的BMI<25这类写法是逻辑判断表达式,运行后只会返回TRUE/FALSE的布尔值,不会自动提取符合条件的BMI数值;同时原代码的区间判断存在边界漏洞,会漏掉临界值。
修改方案
通过逻辑条件索引筛选提取对应分类的BMI值,用列表列存储多个匹配值,同时修正区间边界,修改后代码如下:
weight %>% select(Id, BMI) %>% # 若需要按Id分组统计每个用户的各分类BMI数据则保留此行,统计全量数据则删除 group_by(Id) %>% summarise( healthy = list(BMI[BMI < 25]), not_obese = list(BMI[BMI >= 25 & BMI < 30]), low_risk_obesity = list(BMI[BMI >= 30 & BMI < 35]), moderate_risk_obesity = list(BMI[BMI >= 35 & BMI < 40]), High_risk_obesity = list(BMI[BMI >= 40]), count_records = n(), .groups = "drop" ) %>% View()
关键说明
BMI[判断条件]是R基础的索引写法,会直接返回符合判断条件的BMI数值,外层套list()是因为单个分类下可能匹配多个值,存在列表列中即可实现“单元格内存放多个数值”的效果,和你给出的示例格式一致。- 原代码的区间判断存在缺口:比如漏掉了
BMI=25、29.9<BMI<30这类临界值,调整为左闭右开区间后所有BMI值都能被正确归类,不会出现遗漏。 - 新增
.groups = "drop"参数,会在summarise计算完成后自动解除分组,避免后续数据处理受残留分组影响。
内容的提问来源于stack exchange,提问作者Suehi
相关产品推荐
相关产品推荐

