Невозможно использовать 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.