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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:05:22