关于用R语言dplyr实现随访体重逐期递增校验的代码咨询
代码正确性与优化建议
一、现有代码的正确性
你的代码逻辑上完全符合需求:通过逐个校验相邻随访节点的体重(第10周≥第6周、第14周≥第10周……),最终用1/0标记是否全程满足非递减趋势。但存在一个潜在问题:如果任意一个体重字段存在NA(缺失值),ifelse会返回NA而非0,导致该条记录的校验结果缺失,无法直接判断是否符合要求。
二、优化方向
1. 处理缺失值,避免结果缺失
如果业务要求只要有一个节点体重缺失,就标记为不符合(0),可以在条件中补充缺失值判断:
wght_data %>% mutate( wght_correct = ifelse( !is.na(wght1_ia6w) & !is.na(wght1_ia10w) & !is.na(wght1_ia14w) & !is.na(wght1_ia6m) & !is.na(wght1_ia9m) & !is.na(wght1_ia12m) & !is.na(wght1_ia18m) & !is.na(wght1_ia24m) & wght1_ia6w <= wght1_ia10w & wght1_ia10w <= wght1_ia14w & wght1_ia14w <= wght1_ia6m & wght1_ia6m <= wght1_ia9m & wght1_ia9m <= wght1_ia12m & wght1_ia12m <= wght1_ia18m & wght1_ia18m <= wght1_ia24m, 1, 0)) -> wght_data
如果允许忽略缺失节点、仅校验有数据的节点是否非递减,可以用case_when结合diff()处理:
wght_data %>% rowwise() %>% mutate( wght_correct = case_when( # 所有体重非空时,校验全程非递减 all(!is.na(c_across(wght1_ia6w:wght1_ia24m))) ~ as.integer(all(diff(c_across(wght1_ia6w:wght1_ia24m)) >= 0)), # 存在缺失时,仅校验非空节点的顺序 TRUE ~ as.integer(all(diff(na.omit(c_across(wght1_ia6w:wght1_ia24m))) >= 0)) ) ) %>% ungroup() -> wght_data
2. 简化代码,提升可维护性
如果后续随访节点增加,逐个写比较条件会非常繁琐。可以通过动态选择体重列,结合diff()批量校验:
# 按时间顺序定义体重列名 weight_cols <- c("wght1_ia6w", "wght1_ia10w", "wght1_ia14w", "wght1_ia6m", "wght1_ia9m", "wght1_ia12m", "wght1_ia18m", "wght1_ia24m") wght_data %>% rowwise() %>% mutate( # 检查所有相邻节点的差值≥0,无缺失时返回1/0 wght_correct = as.integer(all(diff(c_across(all_of(weight_cols))) >= 0, na.rm = FALSE)) ) %>% ungroup() -> wght_data
这种写法的优势是:新增随访节点时,只需在weight_cols向量中添加列名即可,无需修改校验逻辑。
3. 增强可读性
可以给中间步骤添加注释,或用变量存储校验条件,让代码更易理解:
weight_cols <- c("wght1_ia6w", "wght1_ia10w", "wght1_ia14w", "wght1_ia6m", "wght1_ia9m", "wght1_ia12m", "wght1_ia18m", "wght1_ia24m") wght_data %>% rowwise() %>% mutate( # 获取当前行按时间排序的体重数据 weight_sequence = list(c_across(all_of(weight_cols))), # 检查序列是否非递减(无缺失值) is_non_decreasing = all(diff(weight_sequence[[1]]) >= 0, na.rm = FALSE), wght_correct = as.integer(is_non_decreasing) ) %>% ungroup() %>% select(-weight_sequence, -is_non_decreasing) -> wght_data
内容的提问来源于stack exchange,提问作者Ashu Sharma
相关产品推荐
相关产品推荐

