含缺失值判断的SAS条件语句转R代码求助
SAS转R代码:缺失值条件语句转换
原SAS代码
mvpawk=(wmpa)+(wvpa*2); if mvpawk>2520 then mvpawk=2520; /*cap six hours per day*/ mets=mvpawk*3; if . < mvpawk <150 then meetcdc=0; # Not sure else if mvpawk >=150 then meetcdc=1; if nopa in (.,1) and ltpa in (.,2) and mvpawk=0 then sedentary=1; # Not sure else if nopa=2 or ltpa=1 or mvpawk > 0 then sedentary=0;
已尝试的R代码
lifestyle$mvpawk <- lifestyle$wmpa + (lifestyle$wvpa *2) lifestyle$mvpawk[which(lifestyle$mvpawk > 2520)] <- 2520 lifestyle$meetcdc <- ifelse(lifestyle$mvpawk < 150, 0,1)
补充缺失的条件转换
1. meetcdc变量的完整转换
SAS中. < mvpawk的作用是判断mvpawk不是缺失值(SAS里缺失值.比任何数值都小,仅非缺失数值能满足该条件)。原逻辑需保留缺失值场景:
- 非缺失且
mvpawk < 150→meetcdc=0 mvpawk >=150→meetcdc=1mvpawk为缺失值时,meetcdc保持缺失
用base R实现:
lifestyle$meetcdc <- ifelse(is.na(lifestyle$mvpawk), NA, ifelse(lifestyle$mvpawk < 150, 0, 1))
用dplyr的case_when更直观:
library(dplyr) lifestyle <- lifestyle %>% mutate(meetcdc = case_when( is.na(mvpawk) ~ NA_real_, mvpawk < 150 ~ 0, mvpawk >= 150 ~ 1 ))
2. sedentary变量的转换
SAS中nopa in (.,1)表示nopa是缺失值或等于1,ltpa in (.,2)表示ltpa是缺失值或等于2。原逻辑:
- 当
nopa(缺失/1)且ltpa(缺失/2)且mvpawk=0→sedentary=1 - 当
nopa=2或ltpa=1或mvpawk>0→sedentary=0 - 其他场景(如
nopa缺失但ltpa既非缺失也非2),sedentary保持缺失
用base R实现:
cond1 <- (is.na(lifestyle$nopa) | lifestyle$nopa == 1) & (is.na(lifestyle$ltpa) | lifestyle$ltpa == 2) & (lifestyle$mvpawk == 0) cond2 <- (lifestyle$nopa == 2) | (lifestyle$ltpa == 1) | (lifestyle$mvpawk > 0) lifestyle$sedentary <- ifelse(cond1, 1, ifelse(cond2, 0, NA))
用dplyr的case_when实现:
lifestyle <- lifestyle %>% mutate(sedentary = case_when( (is.na(nopa) | nopa == 1) & (is.na(ltpa) | ltpa == 2) & mvpawk == 0 ~ 1, nopa == 2 | ltpa == 1 | mvpawk > 0 ~ 0, TRUE ~ NA_real_ # 其他情况返回缺失值 ))
补充mets变量的转换
原SAS中的mets=mvpawk*3可直接在R中添加:
lifestyle$mets <- lifestyle$mvpawk * 3
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

