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))
Другие вопросы по тегам