You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

满足条件时复制上一行数据的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:04:51