代码之家  ›  专栏  ›  技术社区  ›  Cina

扩展值以填充缺少的值

na r
  •  1
  • Cina  · 技术社区  · 6 年前

    我要从第一个非丢失值中填充缺少的值并将其扩展:

    user   action
        1       NA
        1        2
        1       NA
        1       NA 
        1        3
        1       NA
        2       NA
        2       NA
        2        1
        2       NA
    

    我想要的输出:

           user   action
            1        0
            1        2
            1        2
            1        2 
            1        3
            1        3
            2        0
            2        0
            2        1
            2        1
    

    基本上,基于 user 我想填写NA值。它从0开始,当达到下一个值时,扩展并替换 "NA" 直到下一个值。它继续为每个用户服务。

    3 回复  |  直到 6 年前
        1
  •  2
  •   www    6 年前

    dplyr tidyr replace

    library(dplyr)
    library(tidyr)
    
    dat2 <- dat %>%
      group_by(user) %>%
      fill(action) %>%
      ungroup() %>%
      replace(., is.na(.), 0)
    dat2
    # # A tibble: 10 x 2
    #     user action
    #    <int>  <dbl>
    #  1     1      0
    #  2     1      2
    #  3     1      2
    #  4     1      2
    #  5     1      3
    #  6     1      3
    #  7     2      0
    #  8     2      0
    #  9     2      1
    # 10     2      1
    

    dat <- read.table(text = "user   action
        1       NA
                      1        2
                      1       NA
                      1       NA 
                      1        3
                      1       NA
                      2       NA
                      2       NA
                      2        1
                      2       NA",
                      header = TRUE, stringsAsFactors = FALSE)
    
        2
  •  2
  •   G. Grothendieck    6 年前

    ave na.locf0 na.fill

    library(zoo)
    
    transform(DF, action = na.fill(ave(action, user, FUN = na.locf0), 0))
    

       user action
    1     1      0
    2     1      2
    3     1      2
    4     1      2
    5     1      3
    6     1      3
    7     2      0
    8     2      0
    9     2      1
    10    2      1
    

    DF <- structure(list(user = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L
    ), action = c(NA, 2L, NA, NA, 3L, NA, NA, NA, 1L, NA)), 
    class = "data.frame", row.names = c(NA, -10L))
    
        3
  •  1
  •   lmo    6 年前

    ifelse cummax ave

    ave(ifelse(!is.na(dat$action), dat$action, 0), dat$user, FUN=cummax)
    [1] 0 2 2 2 3 3 0 0 1 1