#r #dplyr
#r #дплыр
Вопрос:
Я пытаюсь получить отдельную таблицу частот для каждой переменной, используя цикл и пакет dplyr, пример моего кода приведен ниже с использованием данных mtcars:
library(dplyr)
var= c("vs", "am", "gear")
for (i in var){
mtcars %>%
group_by(carb) %>%
count(i)
}
К сожалению, только я получаю:
Error: Column `i` is unknown
Я также пытался с
for (i in var){
mtcars %>%
group_by(carb) %>%
summarise_each(funs(n()), i)
}
Но не преуспевает,
Пожалуйста, я буду благодарен за любой совет.
Ответ №1:
Мы можем использовать !!sym()
для имен переменных. Я бы также рекомендовал сохранить результаты в виде списка следующим образом.
var <- c("vs", "am", "gear")
library(dplyr)
count_tables <- list()
for (i in var){
temp <- mtcars %>%
group_by(carb) %>%
count(!!sym(i))
count_tables[[i]] <- temp
}
count_tables
# $vs
# # A tibble: 8 x 3
# # Groups: carb [6]
# carb vs n
# <dbl> <dbl> <int>
# 1 1 1 7
# 2 2 0 5
# 3 2 1 5
# 4 3 0 3
# 5 4 0 8
# 6 4 1 2
# 7 6 0 1
# 8 8 0 1
#
# $am
# # A tibble: 9 x 3
# # Groups: carb [6]
# carb am n
# <dbl> <dbl> <int>
# 1 1 0 3
# 2 1 1 4
# 3 2 0 6
# 4 2 1 4
# 5 3 0 3
# 6 4 0 7
# 7 4 1 3
# 8 6 1 1
# 9 8 1 1
#
# $gear
# # A tibble: 11 x 3
# # Groups: carb [6]
# carb gear n
# <dbl> <dbl> <int>
# 1 1 3 3
# 2 1 4 4
# 3 2 3 4
# 4 2 4 4
# 5 2 5 2
# 6 3 3 3
# 7 4 3 5
# 8 4 4 4
# 9 4 5 1
# 10 6 5 1
# 11 8 5 1
Также часто используется lapply
для перебора вектора или списка, чтобы применить функцию и вернуть объекты в виде списка. Следующий генерирует тот же результат, что и цикл for.
count_tables <- lapply(var, function(x) {
mtcars %>%
group_by(carb) %>%
count(!!sym(i))
})
names(count_tables) <- var
Ответ №2:
Для программной передачи переменной в виде строки вы можете использовать версию этих функций с подчеркиванием в конце, такую как count_
, group_by_
и т.д.
В этом случае это было бы:
for (i in var){
mtcars %>%
group_by(carb) %>%
count_(i) %>%
print()
}
Вы специально просили for
цикл, но для вашего рассмотрения предлагается lapply
альтернатива, которая упрощает хранение различных результатов в одном месте для последующего доступа:
lapply(var, FUN = function(i) mtcars %>% group_by(carb) %>% count_(i))
Комментарии:
1.
count_()
не рекомендуется. Пожалуйста, используйтеcount
сtidyeval
( tidyeval.tidyverse.org ).