满足条件时复制上一行数据的R语言实现需求
解决按组填充缺失数据的问题
先看看你的原始数据生成代码:
set.seed(123) df <- data.frame( loc = rep(1:5, each = 5), value = sample(0:4, 25, replace = T) ) a <- c("x","y","z","k") df$id <- ifelse(df$value == 0, "no.data", sample(a,1)) head(df)
运行后输出的前6行是:
loc value id 1 1 1 z 2 1 3 z 3 1 2 z 4 1 4 z 5 1 4 z 6 2 0 no.data
你的需求很明确:对所有满足id == "no.data"且value == 0的行,复制同一loc分组内前一行的value和id值,预期处理后第6行变成loc=2, value=4, id=z。
实现代码
这里用dplyr包的分组+滞后函数就能完美解决,直接把你的逻辑补充完整:
library(dplyr) df_processed <- df %>% group_by(loc) %>% mutate( # 因为你的规则里value=0和id=no.data是同时出现的,单判断一个条件也可以 value = ifelse(id == "no.data", lag(value), value), id = ifelse(id == "no.data", lag(id), id) ) %>% ungroup() # 记得取消分组,避免后续操作受影响 head(df_processed)
运行结果
处理后的前6行和你预期的完全一致:
loc value id 1 1 1 z 2 1 3 z 3 1 2 z 4 1 4 z 5 1 4 z 6 2 4 z
代码说明
group_by(loc):保证我们是在每个区域分组内找前一行数据,不会跨loc取错值lag(value)/lag(id):dplyr的滞后函数,用来获取当前行的上一行对应字段的值ifelse判断:满足条件时用前一行的值替换,不满足则保留原始值- 最后用
ungroup()取消分组,避免后续对整个数据框操作时还带着分组属性
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

