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

如何使dplyr::lag()在分组数据无滞后值时保留原值?

解决按组更新hp字段的问题

你遇到的问题很常见——用lag()函数时组内第一条记录会变成NA,但你希望保留它的原始值。这里有两种简单的方法可以实现你的需求:

方法一:使用coalesce()函数

coalesce()的作用是返回第一个非NA的值,刚好能完美解决第一条记录的NA问题。代码如下:

library(dplyr)

# 你的原始数据
ds <- structure(list(mpg = c(10.4, 10.4, 15.2, 15.2, 19.2, 19.2, 21, 21), hp = c(205, 215, 180, 150, 123, 175, 110, 110)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -8L), .Names = c("mpg", "hp"))

# 更新hp字段
ds_updated <- ds %>%
  group_by(mpg) %>%
  mutate(hp = coalesce(lag(hp), hp)) %>%
  ungroup()

# 查看结果
print(ds_updated)

运行后你会得到预期的结果:

# A tibble: 8 × 2
    mpg    hp
  <dbl> <dbl>
1  10.4   205
2  10.4   205
3  15.2   180
4  15.2   180
5  19.2   123
6  19.2   123
7  21     110
8  21     110

方法二:用row_number()判断组内首行

如果你更倾向于明确判断组内的第一条记录,可以用row_number()来标记行号,然后针对性保留原始值:

ds_updated <- ds %>%
  group_by(mpg) %>%
  mutate(hp = if_else(row_number() == 1, hp, lag(hp))) %>%
  ungroup()

这个方法的逻辑很直观:当行号是1(组内第一条)时,保留原始hp;否则使用前一条记录的hp值。

两种方法都能达到你的需求,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:14