【问题标题】:Add rows to a df in R that are missing and fill with NA using dplyr将行添加到 R 中缺少的 df 并使用 dplyr 填充 NA
【发布时间】:2020-06-24 14:40:24
【问题描述】:

所以我有一个这样的df

ID  store        price
1   Walmart      1.00
2   WholeFoods   2.33
3   Footlocker   2.55
4   Denny's      1.09
5   Walgreens    .99
6   CVS          7.00

经过一些操作,它变成了

ID  store        price  varA   varB  varC
2   WholeFoods   2.33   D      56    A
3   Footlocker   2.55   TT     302   B
6   CVS          7.00   A      122   C

我的目标是我想要一个包含所有 ID 的 DF 在这个新的 df 中,只是在这些新列上带有 NA,所以基本上。

ID  store        price  varA   varB  varC
1   Walmart      1.00   NA     NA    NA
2   WholeFoods   2.33   D      56    A
3   Footlocker   2.55   TT     302   B
4   Denny's      1.09   NA     NA    NA
5   Walgreens    .99    NA     NA    NA
6   CVS          7.00   A      122   C

【问题讨论】:

    标签: r dplyr tidyverse na rbind


    【解决方案1】:

    您可以使用dplyr 或可能更好的base R 解决方案。

    dplyr

    在您的特定情况下,可以使用来自dplyr 包的full_join() 来完成:

    a <- read.table(header = T, text = "
    ID  store        price
    1   Walmart      1.00
    2   WholeFoods   2.33
    3   Footlocker   2.55
    4   Denny's      1.09
    5   Walgreens    .99
    6   CVS          7.00
    ")
    
    b <- read.table(header = T, text = "
    ID  store        price  varA   varB  varC
    2   WholeFoods   2.33   D      56    A
    3   Footlocker   2.55   TT     302   B
    6   CVS          7.00   A      122   C
    ")
    
    full_join(a, b)
    

    结果:

      ID      store price varA varB varC
    1  1    Walmart  1.00 <NA>   NA <NA>
    2  2 WholeFoods  2.33    D   56    A
    3  3 Footlocker  2.55   TT  302    B
    4  4    Denny's  1.09 <NA>   NA <NA>
    5  5  Walgreens  0.99 <NA>   NA <NA>
    6  6        CVS  7.00    A  122    C
    

    基础 R 解决方案

    可以通过base Rmerge()函数轻松完成:

    merge(a, b, all = TRUE)
    #  ID      store price varA varB varC
    #1  1    Walmart  1.00 <NA>   NA <NA>
    #2  2 WholeFoods  2.33    D   56    A
    #3  3 Footlocker  2.55   TT  302    B
    #4  4    Denny's  1.09 <NA>   NA <NA>
    #5  5  Walgreens  0.99 <NA>   NA <NA>
    #6  6        CVS  7.00    A  122    C
    

    dplyr更快:

    Unit: milliseconds
                     expr    min       lq      mean   median       uq     max neval
     merge(a, b, all = T) 1.3881  2.42335  3.259999  2.96615  4.01390  8.9954   100
          full_join(a, b) 6.2017 10.17300 12.653397 12.36170 14.46095 34.0763   100
    

    【讨论】:

      【解决方案2】:

      您可以将第二个数据框与第一个数据框左连接:

      dplyr::left_join(df1, df2)
      

      这将产生预期的输出:

      Joining, by = c("ID", "store", "price")
        ID      store price varA varB varC
      1  1    Walmart  1.00 <NA>   NA <NA>
      2  2 WholeFoods  2.33    D   56    A
      3  3 Footlocker  2.55   TT  302    B
      4  4    Denny's  1.09 <NA>   NA <NA>
      5  5  Walgreens  0.99 <NA>   NA <NA>
      6  6        CVS  7.00    A  122    C
      

      【讨论】:

        猜你喜欢
        • 2019-04-29
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多