R语言使用dplyr处理数据框:满足条件替换行值其余值不变
问题原因
你的代码存在两个核心问题:
case_when没有指定默认分支,所有不满足前两个判断条件的行都会被默认赋值为NA,这是你不满足条件的行数据丢失的直接原因- 仅处理了
columnA == columnB的当前行,没有对匹配行的下一行做赋值NA的处理,无法实现需求要求的下一行插空逻辑
修正后代码
library(dplyr) # 加载原始数据集 data <- structure(list(id = c(1, 1, 1, 1, 1), columnA = c("2011/01/01", "2013/01/01", "2014/01/01", "2015/01/01", "2015/01/10"), columnB = c("NA", "2013/01/01", "2013/01/02", "2014/01/01", "NA")), row.names = c(NA, 5L), class = "data.frame") # 数据处理逻辑 res <- data %>% group_by(id) %>% # 先将字符串形式的"NA"转为标准缺失值,避免匹配错误 mutate(across(c(columnA, columnB), ~ifelse(.x == "NA", NA_character_, .x))) %>% # 标记A列和B列值相等的行 mutate(match_row = columnA == columnB) %>% # 按需求更新B列 mutate(columnB = case_when( # 匹配行取B列下一行的值 match_row ~ lead(columnB), # 匹配行的下一行设为NA lag(match_row, default = FALSE) ~ NA_character_, # 其余行保持原值不变 TRUE ~ columnB )) %>% # 调整列名和输出格式,和期望结果对齐 ungroup() %>% mutate( A = ifelse(is.na(columnA), "NA", columnA), B = ifelse(is.na(columnB), "NA", columnB) ) %>% select(id, A, B)
运行后得到的res结构和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者kam
相关产品推荐
相关产品推荐

