如何在R中不拆分数据集,用SITAR包按性别计算BMI z分数?
在R中使用SITAR包批量计算分性别的BMI z分数
我希望在R中使用SITAR包计算经年龄和性别加权的BMI z分数。目前已通过拆分数据集为男性和女性子集,分别运行以下代码实现:
dataset_males$BMI_zscore<- with(dataset_males, LMS2z(age, BMI, sex = 'm', measure= 'bmi', ref='uk90', toz= TRUE, LMStable=FALSE))
dataset_females$BMI_zscore<- with(dataset_females, LMS2z(age, BMI, sex = 'f', measure= 'bmi', ref='uk90', toz= TRUE, LMStable=FALSE))
之后将子集合并回单个数据集。但我想知道是否可以不拆分样本直接为男女计算BMI z分数。我尝试结合dplyr和SITAR编写以下代码但未成功:
Dataset %>% mutate (BMI_zscore = case_when(sex=='Male' ~ with(dataset, LMS2z(age, BMI, sex = 'm', measure= 'bmi', ref='uk90', toz= TRUE, LMStable=FALSE)), sex =='Female' ~ with(dataset, LMS2z(age, BMI, sex = 'f', measure= 'bmi', ref='uk90', toz= TRUE, LMStable=FALSE)), TRUE ~ NA))
请问该如何实现这一需求?
解决方案
你的代码存在几个问题:
case when应为case_when(注意下划线)- 无需嵌套
with(dataset, ...),dplyr管道中当前数据集已是上下文,可直接调用列名 - 需明确指定NA的类型为数值型(
NA_real_),避免类型不匹配
这里提供两种无需拆分数据集的可行方法:
方法1:修正case_when逻辑
直接根据性别分支调用对应参数的LMS2z:
library(dplyr) library(sitar) dataset <- dataset %>% mutate( BMI_zscore = case_when( sex == 'Male' ~ LMS2z(age, BMI, sex = 'm', measure = 'bmi', ref = 'uk90', toz = TRUE, LMStable = FALSE), sex == 'Female' ~ LMS2z(age, BMI, sex = 'f', measure = 'bmi', ref = 'uk90', toz = TRUE, LMStable = FALSE), TRUE ~ NA_real_ ) )
方法2:统一性别编码后批量计算
先将数据集中的性别值转换为LMS2z接受的格式,再一次性调用函数,代码更简洁:
library(dplyr) library(sitar) dataset <- dataset %>% mutate( # 映射性别编码 sex_code = recode(sex, 'Male' = 'm', 'Female' = 'f'), # 批量计算z分数 BMI_zscore = LMS2z(age, BMI, sex = sex_code, measure = 'bmi', ref = 'uk90', toz = TRUE, LMStable = FALSE) ) %>% # 可选:删除中间生成的sex_code列 select(-sex_code)
内容的提问来源于stack exchange,提问作者PsychSilvia
相关产品推荐
相关产品推荐

