Tidyverse:用最新的非NA值替换NA,*使用tidyverse工具*

问题描述 投票:0回答:1

使用zoo::data.table::之前,我的问题已经回答;我很好奇tidyverse / dplyr的最佳解决方案是什么。

先前的答案(非tidyverse):Forward and backward fill data frame in RReplacing NAs with latest non-NA value

我的数据看起来像这样,每个国家(美国,澳大利亚)最早的两年(2015年,2016年)都缺少数据(底部输入数据的代码):

#>   country year value
#> 1     usa 2015    NA
#> 2     usa 2016    NA
#> 3     usa 2017   100
#> 4     usa 2018    NA
#> 5     aus 2015    NA
#> 6     aus 2016    NA
#> 7     aus 2017    50
#> 8     aus 2018    60

我想用2017年可用的值来填补每个国家/地区中缺少的值。

我希望该填充仅适用于2017年之前的年份,因此2018年的NA不应该使用任何填充。它应该保持不适用。

所以我想要的输出是:

#>   country year value
#> 1     usa 2015   100
#> 2     usa 2016   100
#> 3     usa 2017   100
#> 4     usa 2018    NA
#> 5     aus 2015    50
#> 6     aus 2016    50
#> 7     aus 2017    50
#> 8     aus 2018    60

[我尝试过group_by(country),然后怀疑我是要使用coalesce(),但是我通常跨向量而不是沿着向量使用coalesce

library(tidyverse)
df %>% group_by(country) %>% 

使用tidyverse工具最简单的方法是什么?

数据输入代码:

#install.packages("datapasta")
df <- data.frame(
  stringsAsFactors = FALSE,
           country = c("usa", "usa", "usa", "usa", "aus", "aus", "aus", "aus"),
              year = c(2015L, 2016L, 2017L, 2018L, 2015L, 2016L, 2017L, 2018L),
             value = c(NA, NA, 100L, NA, NA, NA, 50L, 60L)
)
df

r dplyr tidyverse coalesce
1个回答
1
投票

您可以使用replace

library(dplyr)
df %>% 
 group_by(country) %>% 
 mutate(value = replace(value, is.na(value), value[year == 2017]))
© www.soinside.com 2019 - 2024. All rights reserved.