использование имен столбцов переменных в dplyr summarize

avatar
drmariod
21 августа 2018 в 08:35
3183
1
3

Я обнаружил, что этот вопрос уже задан, но на него нет правильного ответа. R с использованием имен столбцов переменных в функции суммирования в dplyr

Я хочу вычислить разницу между двумя средними значениями столбцов, но имя столбца должно быть предоставлено переменными ... Пока что я нашел только функцию as.name для предоставления имен столбцов в виде текста, но это почему-то не работает вот ...

С фиксированными именами столбцов это работает.

x <- c('a','b')
df <- group_by(data.frame(a=c(1,2,3,4), b=c(2,3,4,5), c=c(1,1,2,2)), c)
df %>% summarise(mean(a) - mean(b))

С переменными столбцами не работает

df %>% summarise(mean(x[1]) - mean(x[2]))
df %>% summarise(mean(as.name(x[1])) - mean(as.name(x[2])))

Поскольку этот вопрос был задан уже 3 года назад, а dplyr находится в стадии хорошей разработки, мне интересно, есть ли ответ на этот вопрос сейчас.

Источник
drmariod
21 августа 2018 в 08:38
0

x с двумя именами столбцов, так что да, две строки.

Moody_Mudskipper
21 августа 2018 в 08:45
4

вы можете использовать get: df %>% summarise(mean(get(x[1])) - mean(get(x[2])))

drmariod
21 августа 2018 в 08:48
0

Вау, это помогает! Не стесняйтесь писать в качестве ответа! Почему это нигде не задокументировано? Я ожидал, что as.name будет работать.

Ответы (1)

avatar
Moody_Mudskipper
21 августа 2018 в 08:52
6

Вы можете использовать base::get:

df %>% summarise(mean(get(x[1])) - mean(get(x[2])))

# # A tibble: 2 x 2
#        c `mean(a) - mean(b)`
#    <dbl>               <dbl>
# 1     1                  -1
# 2     2                  -1

get по умолчанию будет искать в текущей среде.

Как говорится в сообщении об ошибке, mean ожидает логический или числовой объект, as.name возвращает имя:

class(as.name("a")) # [1] "name"

Вы можете оценить свое имя, это тоже подойдет:

df %>% summarise(mean(eval(as.name(x[1]))) - mean(eval(as.name(x[2]))))
# # A tibble: 2 x 2
#       c `mean(eval(as.name(x[1]))) - mean(eval(as.name(x[2])))`
#   <dbl>                                                   <dbl>
# 1     1                                                      -1
# 2     2                                                      -1