R语言:用非NA值的递增/递减值替换缺失值

4

我正在尝试通过一组递增和递减填补缺失的年份值,当我知道每个递增/递减应该是1时。以下是一个可重现的示例。请注意,有两个ID,其中第一个ID从2002年开始(尽管它丢失了),第二个ID从2007年开始(同样也缺失)。我从现有的年份以及递增/递减应该是1这个事实中了解到这一点。

id <- rep(c("01012895", "01021890"), each = 6)
value <- c(rnorm(12))
year <- c("NA", "NA", 2004, "NA", "NA", 2007, "NA", "NA", "NA", 2010, "NA", "NA")
df <- data.frame(id, value, year)

df
         id       value year
1  01012895 -1.05853432   NA
2  01012895  0.06480395   NA
3  01012895 -3.32811206 2004
4  01012895 -0.33427578   NA
5  01012895 -0.22790538   NA
6  01012895  1.46991465 2007
7  01021890 -0.65928777   NA
8  01021890 -0.25701765   NA
9  01021890  1.24331689   NA
10 01021890  0.10006530 2010
11 01021890 -0.83971071   NA
12 01021890  1.15893263   NA

df2是我最终想要的结果。

year2 <- c(2002:2007, 2007:2012)
df2 <- data.frame(id, value, year2)

我尝试找到一个绕过使用fill的方法,就像在df3中一样,但它只保留现有值,没有更改的选项。
df3 <- df %>% group_by(site_no) %>% fill(year, .direction = "updown")
1个回答

4

以下是一种方法。

首先,处理您自己的数据:

id <- rep(c("01012895", "01021890"), each = 6)
value <- c(rnorm(12))
year <- c(NA, "NA", 2004, "NA", "NA", 2007, "NA", "NA", "NA", 2010, "NA", "NA")
df <- data.frame(id, value, year)

year2 <- c(2002:2007, 2007:2012)
df2 <- data.frame(id, value, year2)

将因子转换为整数,使用行号和分组最大索引,我们得到以下结果:

library(dplyr)

df3 <- df %>% 
  group_by(id) %>%
  mutate(
    year = as.integer(as.character(year)), # Convert factor to integer
    year =  max(year, na.rm = TRUE) + (row_number() - which.max(year))
  )

df3
#> # A tibble: 12 x 3
#> # Groups:   id [2]
#>    id         value  year
#>    <fct>      <dbl> <int>
#>  1 01012895  0.0482  2002
#>  2 01012895 -0.445   2003
#>  3 01012895  0.459   2004
#>  4 01012895 -0.740   2005
#>  5 01012895  1.91    2006
#>  6 01012895 -1.66    2007
#>  7 01021890 -1.08    2007
#>  8 01021890 -0.816   2008
#>  9 01021890  0.395   2009
#> 10 01021890 -0.0294  2010
#> 11 01021890  0.397   2011
#> 12 01021890  0.273   2012

all(df2 == df3)
#> [1] TRUE

它会产生一个警告,忽略它应该是可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接