【问题标题】:Expanding tibble to full grid and keep all values将 tibble 扩展到完整网格并保留所有值
【发布时间】:2020-02-14 06:11:32
【问题描述】:

如果我有一个像下面这样的数据框,是否可以扩展并保留所有值(不覆盖源 tibble 或保存中间结果)?

library(tidyverse)

d <- tibble(a = c("a", "a", "a", "b", "b"),
            b = c("2019", "2020", "2021", "2019", "2020"),
            x = 1:5) %>%
  spread(key = b, value = x) # I did this on purpose because ..

# is it possible to simplify this?
d %>%
  gather(-a, key = "b", val = "x") %>% # .. otherwise I could just join
  expand(a, b) %>%
  left_join(d %>%
              gather(-a, key = "b", val = x),
            by = c("a", "b"))

# is it possible to do something like:
d %>%
  gather(-a, key = "b", val = "x") %>%
  expand(a, b, .keep_all = TRUE) # there is of course no .keep_all for expand

# want data set
# a     b         x
# <chr> <chr> <int>
#   1 a     2019      1
# 2 a     2020      2
# 3 a     2021      3
# 4 b     2019      4
# 5 b     2020      5
# 6 b     2021     NA

我可能遗漏了一些东西,但我找不到解决方案。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    仍然不确定,也许:

    my_expand <- function(d, ...) {
      keep_vars = ensyms(...)
      expand(d, !!!keep_vars) %>%
        left_join(d, by = map_chr(keep_vars, expr_text))
    }
    
    d %>% 
      my_expand(a, b)
    
    # a     b         x
    # <chr> <chr> <int>
    #   1 a     2019      1
    # 2 a     2020      2
    # 3 a     2021      3
    # 4 b     2019      4
    # 5 b     2020      5
    # 6 b     2021     NA
    

    【讨论】:

      【解决方案2】:

      这个怎么样?

      d %>%
        spread(b, x) %>%
        gather(b, x, -a) %>%
        arrange(x)
      # A tibble: 6 x 3
      #  a     b         x
      #  <chr> <chr> <int>
      #1 a     2019      1
      #2 a     2020      2
      #3 a     2021      3
      #4 b     2019      4
      #5 b     2020      5
      #6 b     2021     NA
      
      

      使用pivot_widerpivot_longer

      d %>% pivot_wider(names_from = b, values_from = x) %>%
        pivot_longer(-a, names_to = "b", values_to = "x")
      
      # # A tibble: 6 x 3
      #   a     b         x
      # <chr> <chr> <int>
      # 1 a     2019      1
      # 2 a     2020      2
      # 3 a     2021      3
      # 4 b     2019      4
      # 5 b     2020      5
      # 6 b     2021     NA
      

      【讨论】:

        猜你喜欢
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多