在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
相关产品推荐
相关产品推荐

