R - rlang - Работа с отложенной оценкой
Попытка решить следующий вариант использования:
У меня есть полный набор данных (mydf
) который я хочу dplyr::group_by
с различными наборами переменных в соответствии с записями другого набора комбинаций переменных (mysplits
). Вопрос в том, мой mysplits
data.frame содержит имена переменных в виде символов.
E сть dplyr::group_by_
вариант, но я надеюсь добиться этого с помощью инструментов, аналогичных rlang
функциональность или что-то подобное.
mydf <-
data.frame(
var1 = c('x', 'x', 'y', 'y'),
var2 = c('y', 'z', 'x', 'z'),
var3 = c('a', 'b', 'a', 'b'),
outcome = runif(4),
stringsAsFactors = F
)
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors = F
)
Я ищу что-то похожее на:
dlply(
.data = mysplits, .variables = (g1, g2),
function(thissplit){
group_by(mydf, f(thissplit$g1), f(thissplit$g2)) %>% summarise(mean(outcome))
}
)
где f()
это недостающий компонент моей головоломки.
1 ответ
Во-первых, убедитесь, что ваш data.frame из имен имеет символьные значения, а не уровни факторов
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors=FALSE
)
Тогда вы можете использовать group_by_at
со строками, чтобы выбрать имена столбцов. Например
group_by_at(mydf, c("var1", "var2")) %>% summarise(mean(outcome))
Вы можете зацикливать значения по-разному, но используя другие функции Tidyverse, а не функции Plyr, которые вы можете сделать
map2(mysplits$g1, mysplits$g2, ~group_by_at(mydf, c(.x, .y)) %>% summarise(mean(outcome)))
Если вы настаиваете на использовании group_by
и Rlang вещи, вы можете конвертировать символы в символы с rlang::sym()
а затем цитировать тех, кто !!
так что-то вроде
group_by(mydf, !!rlang::sym(thissplit$g1), !!rlang::sym(thissplit$g2)) %>% summarise(mean(outcome))