Ошибка при использовании n () внутри summarise_at ()

При использовании n () в summarise_at () я получаю эту ошибку:

Error: n() should only be called in a data context
Call `rlang::last_error()` to see a backtrace

Другие предположили, что это может быть проблема маскировки dplyr с plyr, есть два решения:

  1. Замените summarise_at() на `dplyr :: summarise_at () '
  2. Звоните detach("package:plyr", unload=TRUE)

Ни один из них не удалил эту ошибку, и мне любопытно понять, что ее вызывает. Вот воспроизводимый пример, который должен привести к той же ошибке:

Df <- data.frame(
  Condition = c(rep("No", 20), rep("Yes",20)),
  Height = c(rep(1,10),rep(2,10),rep(1,10),rep(2,10)),
  Weight = c(rep(10,5),rep(20,5),rep(30,5), rep(40,5))
)

x <- c("Height","Weight")

Df %>% 
  group_by(Condition) %>% 
  summarise_at(vars(one_of(x)), c(mean = mean, sd = sd, count = n()))

Примечание. Если вы удалите count = n(), код будет работать без проблем.


person Ali    schedule 27.09.2019    source источник
comment
Связано: stackoverflow.com/questions/58068522/   -  person Artem Sokolov    schedule 27.09.2019


Ответы (1)


Я считаю, что это потому, что n() работает с самим источником данных в mutate, filter или summarize, поэтому не является векторизованной функцией. Просто используйте length вместо векторизованной версии.

Df %>% 
  group_by(Condition) %>% 
  summarise_at(vars(one_of(x)), c(mean = mean, sd = sd, count = length))

Если вы хотите иметь только один столбец подсчета, то:

Df %>% 
  group_by(Condition) %>%
  mutate(count = n()) %>%
  group_by(Condition, count) %>%
  summarise_at(vars(one_of(x)), c(mean = mean, sd = sd))
person caldwellst    schedule 27.09.2019
comment
Большое спасибо за объяснение, как побочный вопрос, это приводит к двум столбцам, «Счетчик_высоты» и «Счет_веса», есть ли способ получить только один столбец с именем «Счетчик». - person Ali; 27.09.2019
comment
Немного хакерский, но не думаю, что есть способ сделать это в summarize, поэтому мы можем просто добавить его в вызов mutate раньше и сделать его группой, чтобы сохранить это в нашем результате. Отредактирую свой ответ выше, чтобы добавить. - person caldwellst; 27.09.2019