如何用R的dplyr实现SAS中retain语句的等价功能?
SAS Retain语句转R(dplyr)实现
问题说明
现有SAS代码如下,需要转换为R的dplyr代码,实现retain语句的功能:
data verif; length COMMENTAIRE $20.; retain COMMENTAIRE ; set verif1; if top= 1 then COMMENTAIRE = "delete"; if sample not in ("F","Z") then COMMENTAIRE = "OK"; run;
核心逻辑:
commentaire的值会保持不变,直到触发新的更新条件;- 当
top=1时,commentaire设为"delete",该值持续到sample不属于("F","Z")时,改为"ok"; - 之后"ok"会保持,直到
top=1再次触发,又切换为"delete",循环往复。
期望输出表格:
| top | sample | commentaire |
|---|---|---|
| 0 | F | ok |
| 1 | F | delete |
| 0 | F | delete |
| 0 | E | ok |
| 0 | F | ok |
| 1 | F | delete |
| 0 | F | delete |
dplyr实现代码
library(dplyr) library(tidyr) # 模拟输入数据集(可替换为实际数据) verif1 <- tibble( top = c(0, 1, 0, 0, 0, 1, 0), sample = c("F", "F", "F", "E", "F", "F", "F") ) verif <- verif1 %>% # 初始化commentaire为NA,模拟SAS retain变量初始状态 mutate(commentaire = NA_character_) %>% # 对应SAS第一条if语句:top=1时设置为delete mutate(commentaire = ifelse(top == 1, "delete", commentaire)) %>% # 对应SAS第二条if语句:sample不在F/Z时设置为ok(会覆盖之前的delete) mutate(commentaire = ifelse(!sample %in% c("F", "Z"), "ok", commentaire)) %>% # 向下填充NA,实现值的持续保持 fill(commentaire, .direction = "down") %>% # 处理第一行的初始值,默认设为ok mutate(commentaire = coalesce(commentaire, "ok"))
代码解释
- 初始化变量:先将
commentaire设为NA,对应SAS中retain变量的初始缺失状态; - 按顺序执行条件判断:完全复刻SAS中两条
if语句的执行顺序,第二条条件会覆盖第一条的结果(若同时满足两个条件); - 填充缺失值:用
fill()向下填充NA,实现“值保持直到新条件触发更新”的核心功能; - 初始值处理:用
coalesce()将第一行可能的NA替换为"ok",匹配期望输出的初始状态。
内容的提问来源于stack exchange,提问作者Rgrvkfer
相关产品推荐
相关产品推荐

