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

关于用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:42:39