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

使用dplyr根据起止值将数据框指定列替换为NA

问题:基于start_value和end_value替换指定列为NA(dplyr实现)

需要根据数据框中start_value和end_value的取值,将以value.开头的指定列替换为NA,规则如下:

  • 若start_value与end_value均为NA,该行保持原样
  • 当start_value=1且end_value=3时,替换value.1至value.3为NA
  • 当start_value=2且end_value=3时,替换value.2至value.3为NA,以此类推

示例数据

数据框创建代码

df <- data.frame(
  id=c(1:4),
  value.1=c(0,1,1,0), 
  value.2=c(rep(0,3),1), 
  value.3=c(1,1,1,0), 
  start_value=c(NA,1,2,NA),
  end_value=c(NA,3,3,NA)
)

原数据

idvalue.1value.2value.3start_valueend_value
1001NANA
210113
310123
4010NANA

期望结果

idvalue.1value.2value.3
1001
2NANANA
31NANA
4010

dplyr解决方案

library(dplyr)

df_processed <- df %>%
  rowwise() %>%
  mutate(
    across(
      starts_with("value."),
      ~ {
        # 提取当前value列的数字后缀
        col_suffix <- as.integer(sub("value\\.", "", cur_column()))
        # 判断是否需要替换为NA:start/end非空且列后缀在区间内
        if (!is.na(start_value) && !is.na(end_value) && col_suffix >= start_value && col_suffix <= end_value) {
          NA
        } else {
          .x
        }
      }
    )
  ) %>%
  ungroup() %>%
  # 移除start_value和end_value列,匹配期望结果格式
  select(-start_value, -end_value)

# 输出处理后的数据
print(df_processed)

代码逻辑说明

  1. rowwise():开启逐行处理模式,确保每一行的判断独立执行
  2. across(starts_with("value.")):选中所有以value.开头的目标列
  3. 对每个目标列,提取其数字后缀(如value.2提取为2),判断该后缀是否落在start_value到end_value的区间内,同时排除start_value或end_value为NA的情况,满足条件则将值替换为NA
  4. ungroup():关闭逐行模式,恢复数据框的常规处理状态
  5. select(-start_value, -end_value):移除不需要的辅助列,匹配期望结果的结构

内容的提问来源于stack exchange,提问作者jeff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:00:53