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 столбцов, я попробовал аргумент tidyselect everything()
, показанный ниже. Но это дает понятную ошибку. Я не знаю, как обойти это.
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))
было бы тем, что я действительно хочу. Это существует?