#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
.
- Чтобы исправить это
sym
, используйте!!
:
library(dplyr)
lapply(c("geography","gender"), FUN = function(feature){
df_churn %>%
group_by(!!sym(feature), exited) %>%
count()
})
- с
.data
:
lapply(c("geography","gender"), FUN = function(feature){
df_churn %>%
group_by(.data[[feature]], exited) %>%
count()
})
- С
across
:
lapply(c("geography","gender"), FUN = function(feature){
df_churn %>%
group_by(across(c(feature, "exited"))) %>%
count()
})
- С
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))))