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

在R中计算分组数据差值后将NA替换为后续Diff值

解决方案:分组生成无NA的Diff列

针对你的需求,这里提供几种直接有效的方法,帮你得到每组两行Diff值一致的结果:

方法一:直接计算组内固定差值(推荐)

因为每个Team组只有两个Score数据(Time1和Time2),可以直接计算组内最后一个Score减第一个Score的差值,一次性赋值给整组,避免生成NA:

library(dplyr)

df <- df %>% 
  group_by(Team) %>% 
  mutate(Diff = last(Score) - first(Score)) %>% 
  ungroup()

运行后直接得到目标结果:

Score Time  Team   Diff
  20     1     A       -10
  10     2     A       -10
  15     1     B        15
  30     2     B        15
  15     1     C        -5
  10     2     C        -5

方法二:填充已生成的NA值

如果坚持使用lag()生成Diff后再处理NA,可以用以下几种方式:

方式1:使用tidyr::fill向上填充

利用fill()函数将组内非NA的Diff值向上填充,替换第一行的NA:

library(dplyr)
library(tidyr)

df <- df %>% 
  group_by(Team) %>% 
  mutate(Diff = Score - lag(Score)) %>% 
  fill(Diff, .direction = "up") %>% # 向上填充非NA值
  ungroup()

方式2:使用coalesce结合lead

coalesce()会返回第一个非NA值,这里用它将NA替换为组内下一行的Diff值:

library(dplyr)

df <- df %>% 
  group_by(Team) %>% 
  mutate(Diff = Score - lag(Score),
         Diff = coalesce(Diff, lead(Diff))) %>% 
  ungroup()

方式3:修正case_when的写法

你之前的case_when写法错误,条件应该判断is.na(Diff),而不是直接写NA,修正后即可生效:

library(dplyr)

df <- df %>% 
  group_by(Team) %>% 
  mutate(Diff = Score - lag(Score)) %>% 
  mutate(Diff = case_when(
    is.na(Diff) ~ lead(Diff), # 当Diff为NA时,取下一行的Diff值
    TRUE ~ Diff # 其他情况保留原Diff
  )) %>% 
  ungroup()

内容的提问来源于stack exchange,提问作者Artur Vidaurre de Almeida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:18:22