如何按组替换DataFrame中上下值相同时的中间值?
解决方案
可以使用dplyr包结合lag()和lead()函数实现按组替换操作,核心思路是按组判断每行的上下值是否相等,满足条件则替换当前值:
library(dplyr) df_processed <- df %>% group_by(group) %>% mutate( value = case_when( lag(value) == lead(value) ~ lag(value), TRUE ~ value ) ) %>% ungroup() print(df_processed)
代码说明
group_by(group):按group列分组处理,确保每组内的判断独立进行lag(value):获取当前行的上一行value值lead(value):获取当前行的下一行value值case_when():条件判断,当上下值相等时,将当前行value替换为上一行的值,否则保留原值
运行上述代码后,输出结果与期望一致:
# A tibble: 16 × 2 group value <chr> <dbl> 1 A 2 2 A 2 3 A 2 4 A 2 5 A 2 6 A 2 7 A 2 8 A 2 9 B 3 10 B 3 11 B 3 12 B 3 13 B 3 14 B 3 15 B 4 16 B 4
如果不想依赖dplyr,也可以用基础R实现,通过分组循环处理:
df_processed_base <- df group_indices <- split(seq(nrow(df)), df$group) for (idx in group_indices) { for (i in idx[-c(1, length(idx))]) { if (df_processed_base$value[i-1] == df_processed_base$value[i+1]) { df_processed_base$value[i] <- df_processed_base$value[i-1] } } } print(df_processed_base)
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

