分享
三行代码  ›  专栏  ›  技术社区  ›  scamander

如何基于参考向量完成长格式数据帧的缺失值

  •  1
  • scamander  · 技术社区  · 7 月前

    library(dplyr)
    library(tibble)
    
    
    df <- tibble(
      source = c("a", "b", "b"),
      day = c("D1", "D2", "D3"),
      score = c(10, 5, 3) ) 
    
    
    df
    

    看起来是这样的:

    > df
    # A tibble: 3 x 3
      source day   score
      <chr>  <chr> <dbl>
    1 a      D1       10
    2 b      D2        5
    3 b      D3        3
    

    现在的价值观 source day 是不完整的。完整的列表 白天 存储为矢量:

    complete_source <- c("a", "b","c")
    complete_day <- c("D1", "D2" ,"D3", "D4")
    

    我要做的是根据 complete_source complete_day , 用零(0)填充值。

    期望的结果是(手工制作):

     source day   score
     a      D1       10
     a      D2        0
     a      D3        0
     a      D4        0
     b      D2        5
     b      D3        3
     ... etc ...
     c      D1        0
     c      D2        0
     c      D3        0
     c      D4        0
     ...etc
    

    我怎样才能做到?

    1 回复  |  直到 7 月前
        1
  •  1
  •   akrun    7 月前

    我们可以利用 complete

    library(tidyr)
    library(dplyr)
    complete(df, source = complete_source, day = complete_day, fill = list(score = 0))
    # A tibble: 12 x 3
    #   source day   score
    #   <chr>  <chr> <dbl>
    # 1 a      D1       10
    # 2 a      D2        0
    # 3 a      D3        0
    # 4 a      D4        0
    # 5 b      D1        0
    # 6 b      D2        5
    # 7 b      D3        3
    # 8 b      D4        0
    # 9 c      D1        0
    #10 c      D2        0
    #11 c      D3        0
    #12 c      D4        0
    

    或者做一个 crossing vector 加入

    crossing(source = complete_source, day = complete_day) %>% 
            left_join(df) %>%
            mutate(score = replace_na(score, 0))
    

    base R expand.grid/merge

    transform(merge(expand.grid(source = complete_source, 
          day = complete_day), df, all.x = TRUE), 
          score = replace(score, is.na(score), 0))