Расширение таблицы до полной сетки и сохранение всех значений - PullRequest
0 голосов
/ 17 октября 2019

Если у меня есть фрейм данных, как показано ниже, возможно ли расширить и сохранить все значения (без перезаписи исходной таблицы или сохранения промежуточных результатов)?

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

Возможно, я что-то упустил, ноЯ не мог найти решение.

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Как насчет этого?

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_wider и pivot_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
0 голосов
/ 17 октября 2019

Все еще не уверен, возможно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...