применение функций семейства не работает с group_by(), но работает с select()

#r #tidyverse #lapply

#r #tidyverse #лапчатый #lapply

Вопрос:

Я новичок в R и сталкиваюсь со странными проблемами.

Я пытаюсь создать несколько графиков для каждой символьной переменной в зависимости от количества завершенных переменных.

df_churn

 gender  geography exited
<chr>   <chr>     <fctr>

Female  France  Churn       
Female  Spain   Remain      
Female  France  Churn       
Female  France  Remain      
Female  Spain   Remain      
Male    Spain   Churn       
Male    France  Remain      
Female  Germany Churn       
Male    France  Remain      
Male    France  Remain
  

Я получаю сообщение об ошибке group_by() еще до того, как начну построение графика внутри lapply()

   lapply(c("geography","gender"), FUN = function(feature){
    df_churn %>% 
      group_by(feature, exited) %>%
      count()
  })
  

где, как если бы использовать select() вместо group_by() then, это работает:

   lapply(c("geography","gender"), FUN = function(feature){
    df_churn %>% 
      select(feature, exited) %>% 
      head()
  })

#------------------output-------------#
geography exited
<chr>     <fctr>

France  Churn           
Spain   Remain          
France  Churn           
France  Remain          
Spain   Remain          
Spain   Churn


gender exited
<chr>  <fctr>

Female  Churn           
Female  Remain          
Female  Churn           
Female  Remain          
Female  Remain          
Male    Churn
  

Как я могу исправить это для group_by() ?

Я не могу понять apply семейную работу и enquous , rlang / functional programming в r, что должно упростить повторяющуюся работу. Вместо этого все это иногда действительно расстраивает,

Также буду признателен за любой хороший источник ссылок для их изучения.

Спасибо!!

Комментарии:

1. Избегайте сочетания пакетов с разной грамматикой и семантикой. Поскольку lapply является частью base R, используйте синонимичную версию group_by : aggregate .

2. да, это хороший совет. С этого момента я буду помнить об этом, спасибо!!

3. @Parfait но tally , count не работают aggregate() . этот код завершается ошибкой: {r} df_churn %>% aggregate(by = list(geography, gender, exited), FUN = count) но этот код работает: {r} df_churn %>% aggregate(by = list(geography, gender, exited), FUN = mean)

4. count В базе R. Use нет length , и вам нужно передавать аргументы в виде строк. Смотрите, как построить формулу в aggregate : rextester.com/EQBR29621 . Добро пожаловать в tinyverse !

5. спасибо @Parfait за то, что поделились демонстрационным кодом .. это было действительно полезно!!!

Ответ №1:

Причина, по которой ваш код работает с select , а не с group_by , заключается в том, что select работает с символьными значениями, но нет group_by .

  1. Чтобы исправить это sym , используйте !! :
 library(dplyr)

lapply(c("geography","gender"), FUN = function(feature){
  df_churn %>% 
    group_by(!!sym(feature), exited) %>%
    count()
})
  
  1. с .data :
 lapply(c("geography","gender"), FUN = function(feature){
  df_churn %>% 
    group_by(.data[[feature]], exited) %>%
    count()
})
  
  1. С across :
 lapply(c("geography","gender"), FUN = function(feature){
  df_churn %>% 
    group_by(across(c(feature, "exited"))) %>%
    count()
})
  
  1. С get :
 lapply(c("geography","gender"), FUN = function(feature){
  df_churn %>% 
    group_by(get(feature), exited) %>%
    count()
})
  

Комментарии:

1. вы также можете попробовать с group_by_at(c(feature, 'exited'))

2. Да, но group_by_at теперь заменено, поэтому теперь мы должны использовать это с across .

3. затем с group_by(across(c(feature, exited))) помощью and он обрабатывает свои собственные символы и имена

4. спасибо @RonakShah, он работал хорошо и будет использовать только это.

5. если count это фактическая цель, а не просто воспроизводимый пример, вы можете использовать lapply(c("geography","gender"), function(feature) count(df_churn, across(c(feature, exited))))