R语言按TRIAL分组迁移列值:满足条件时的数据处理问题排查
问题解决:按组迁移列值的正确实现
原代码问题分析
- 未处理NA值:
filter(!any(RL > 5.0 | SL > 5.0))中,D组的RL/SL无大于5的值但存在NA,导致any()返回NA,!any()同样为NA,filter会直接排除这类组,最终结果缺失D组数据。 - 拆分合并方式繁琐:拆分数据框再rbind的写法容易出错,且不如分组后统一处理高效。
正确实现代码
library(tibble) library(dplyr) dt <- tibble( TRIAL = c("A", "A", "A", "B", "B", "B", "C", "C", "C","D","D","D"), RL = c(1, NA, 3, 1, 6, 3, 2, 3, 1, 0, 1.5, NA), SL = c(6, 1.5, 1, 0, 0, 1, 1, 2, 0, 1, 1.5, NA), HC = c(0, 1, 5, 6,7, 8, 9, 3, 4, 5, 4, 2) ) # 核心逻辑:分组后统一处理列值 result <- dt %>% group_by(TRIAL) %>% mutate( # 判断组内是否存在RL/SL大于5的值,忽略NA group_has_over5 = any(RL > 5 | SL > 5, na.rm = TRUE), # 根据组判断结果填充新列RLCT、SLCT RLCT = if(group_has_over5) RL else NA_real_, SLCT = if(group_has_over5) SL else NA_real_, # 根据组判断结果重置原RL、SL列 RL = if(group_has_over5) NA_real_ else RL, SL = if(group_has_over5) NA_real_ else SL ) %>% ungroup() %>% # 调整列顺序匹配预期输出 select(TRIAL, HC, RLCT, SLCT, SL, RL) print(result)
运行结果
执行代码后将得到完整的12行数据,完全符合需求逻辑:
# A tibble: 12 × 6 TRIAL HC RLCT SLCT SL RL <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 A 0 1 6 NA NA 2 A 1 NA 1.5 NA NA 3 A 5 3 1 NA NA 4 B 6 1 0 NA NA 5 B 7 6 0 NA NA 6 B 8 3 1 NA NA 7 C 9 NA NA 1 2 8 C 3 NA NA 2 3 9 C 4 NA NA 0 1 10 D 5 NA NA 1 0 11 D 4 NA NA 1.5 1.5 12 D 2 NA NA NA NA
(注:你提供的预期输出中C组的RL/SL值存在笔误,上述结果严格遵循原数据逻辑生成)
内容的提问来源于stack exchange,提问作者abduljelil
相关产品推荐
相关产品推荐

