Невозможно использовать tidyselect ʻeverything () `в сочетании с` group_by() `и` fill()`

library(tidyverse)
df <- tibble(x1 = c("A", "A", "A", "B", "B", "B"),
             x2 = c(NA, 8, NA, NA, NA, 5),
             x3 = c(3, 6, 5, 9, 1, 9))
#> # A tibble: 6 x 3
#>   x1       x2    x3
#>   <chr> <dbl> <dbl>
#> 1 A        NA     3
#> 2 A         8    NA
#> 3 A        NA     5
#> 4 B        NA     9
#> 5 B        NA     1
#> 6 B         5     9

У меня есть группы "A" и "B", показанные в столбце x1. Мне нужны значения "NA" в столбцахx2 а также x3для заполнения только из значений в той же группе, вupdownнаправление. Это достаточно просто, вот код:

df %>% group_by(x1) %>% fill(c(x2, x3), .direction = "updown")
#> # A tibble: 6 x 3
#>   x1       x2    x3
#>   <chr> <dbl> <dbl>
#> 1 A         8     3
#> 2 A         8     5
#> 3 A         8     5
#> 4 B         5     9
#> 5 B         5     1
#> 6 B         5     9

Моя реальная проблема в том, что мой фрейм данных содержит не только столбцы. x1 через x3. Это больше похоже наx1 через x100. И имена столбцов очень случайны, не в логическом порядке. Чтобы избавить себя от необходимости набирать все ~100 столбцов, я попробовал tidyselecteverything()аргумент, показанный ниже. Но это приводит к понятной ошибке. Я не знаю, как это обойти.

df %>% group_by(x1) %>% fill(everything(), .direction = "updown")
#> Error: Column `x1` can't be modified because it's a grouping variable

Вчера я задал связанный с этим вопрос об именах исключений изeverything()Этот аргумент был слишком простым в моем подходе и, как следствие, вызвал путаницу в отношении того, что я хотел видеть в решении. Предлагаемое решение "можно использоватьselect(-variable)", не будет работать в моем случае, описанном выше (я полагаю). Отсюда возник новый вопрос. Что мне делать?

Я также должен упомянуть, что простой выбор числовой последовательности столбцов (т.е. 2:100) не будет работать, потому что мне нужно выделить несколько столбцов по имени (например, x45, x70). И порядок столбцов может меняться от месяца к месяцу, я должен выбирать по имени столбца. Итак, используяeverything() с возможностью everything_but(column.names = c(x45, x70))было бы то, что я действительно хочу. Он существует?

1 ответ

Решение

Ты можешь сделать:

df %>%
 group_by(x1) %>%
 fill(-x1, .direction = "updown")

  x1       x2    x3
  <chr> <dbl> <dbl>
1 A         8     3
2 A         8     6
3 A         8     5
4 B         5     9
5 B         5     1
6 B         5     9

Это поведение задокументировано в документации к tidyr (также посмотрите комментарий от @Gregor):

Вы можете указать простые имена переменных, выбрать все переменные между x и z с помощью x:z, исключить y с помощью -y.

Другие вопросы по тегам