【问题标题】:R replacing NAs with increment/decrement of non-NA valuesR用非NA值的增量/减量替换NA
【发布时间】:2020-07-15 22:48:11
【问题描述】:

当我知道每个增量/减量应该为 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")

【问题讨论】:

    标签: r replace dplyr na


    【解决方案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)
    
    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
    

    它确实会发出警告,应该可以忽略。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2011-12-05
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多