如何使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
相关产品推荐
相关产品推荐

