Невозможно использовать tidyselect `everything ()` в сочетании с `group_by ()` и `fill ()` - PullRequest
2 голосов
/ 24 октября 2019
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)) было бы тем, что я действительно хочу. Это существует?

1 Ответ

2 голосов
/ 24 октября 2019

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...