использование dplyr::group_by в функции в приложении

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

my_db %>% 
group_by(my_var) %>% 
summarise(n=n()) %>% 
mutate(pc=scales::percent(n/sum(n))) %>% 
arrange(desc(n)) %>% 
head()

Как изменить это выражение, чтобы его можно было использовать в функции применения?

Например, используя mtcars, я пробовал что-то вроде этого:

apply(mtcars[c(2:4,11)], 2, 
   function(x) {
    group_by(!!x) %>% 
      summarise(n=n()) %>% 
      mutate(pc=scales::percent(n/sum(n))) %>% 
      arrange(desc(n)) %>% head()
      }
    )

но это не работает. Любая идея, как я могу этого добиться?


person chrisjacques    schedule 10.07.2018    source источник


Ответы (2)


Вы должны подать заявку, используя colnames(dat), чтобы получить правильные группы:

dat <- mtcars[c(2:4,11)]



grp <- function(x) {
  group_by(dat,!!as.name(x)) %>%
  summarise(n=n()) %>% 
  mutate(pc=scales::percent(n/sum(n))) %>% 
  arrange(desc(n)) %>% head()
}


lapply(colnames(dat), grp)
person Chris    schedule 10.07.2018

apply(mtcars[c(2:4,11)], 2, 
      function(x) { 
    mtcars %>%
    group_by(x= !!x) %>% 
      summarise(n=n()) %>% 
      mutate(pc=scales::percent(n/sum(n))) %>% 
      arrange(desc(n)) %>% head()
  }
)

вам просто нужен родительский df для оценки

person A. Suliman    schedule 10.07.2018
comment
большое спасибо за это, так просто... К сожалению, я получаю это сообщение об ошибке, когда использую код в своем собственном наборе данных, и я не могу понять, в чем проблема (она не выдает эту ошибку со вторым решением, данным Крисом ниже): Ошибка в FUN(X[[i]], ...) : имена переменных ограничены 10000 байтами - person chrisjacques; 10.07.2018
comment
Не беспокойся. Во всяком случае, проблема заключалась в том, чтобы apply переименовать столбец group_by в новой таблице по столбцу, например structure(c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, \n4,~. Следовательно, у вас есть очень длинный столбец, имя переменной не удалось. - person A. Suliman; 10.07.2018