使用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) )
原数据
| id | value.1 | value.2 | value.3 | start_value | end_value |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | NA | NA |
| 2 | 1 | 0 | 1 | 1 | 3 |
| 3 | 1 | 0 | 1 | 2 | 3 |
| 4 | 0 | 1 | 0 | NA | NA |
期望结果
| id | value.1 | value.2 | value.3 |
|---|---|---|---|
| 1 | 0 | 0 | 1 |
| 2 | NA | NA | NA |
| 3 | 1 | NA | NA |
| 4 | 0 | 1 | 0 |
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)
代码逻辑说明
rowwise():开启逐行处理模式,确保每一行的判断独立执行across(starts_with("value.")):选中所有以value.开头的目标列- 对每个目标列,提取其数字后缀(如
value.2提取为2),判断该后缀是否落在start_value到end_value的区间内,同时排除start_value或end_value为NA的情况,满足条件则将值替换为NA ungroup():关闭逐行模式,恢复数据框的常规处理状态select(-start_value, -end_value):移除不需要的辅助列,匹配期望结果的结构
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

