Динамический доступ к столбцам с помощью dplyr - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь динамически взять среднее значение столбца, используя dplyr.С этого сайта https://dplyr.tidyverse.org/articles/programming.html я узнал, что это должно быть возможно следующим образом:

library(dplyr)
df <- data.frame(column=c(1,2,3))

column_string <- "column"
variable <- enquo(column_string) 
print(variable)

Вывод:

<quosure>
  expr: ^"column"
  env:  empty

А затем:

df %>% summarise(mean=mean(!! variable))

Вывод:

  mean
1   NA
Warning message:
In mean.default(~"column") :
  argument is not numeric or logical: returning NA

Ожидаемый результат - это кадр данных со значением 2, конечно.Чего мне не хватает?Я подозреваю, что это что-то делает, что окружение quosure - empty.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Почему бы просто не использовать простое использование as.symbol

df %>% summarise(mean=mean(!! as.symbol(column_string)))
0 голосов
/ 17 декабря 2018

Это будет работать:

library(dplyr)
df <- data.frame(column=c(1,2,3))

column_string <- "column"
variable <- sym(column_string) 
print(variable)

df %>% summarise(mean=mean(!! variable))

Enquo больше подходит, когда вы ссылаетесь на столбцы без кавычек (например, при написании функций), вы можете получить доступ к цитируемым столбцам с помощью sym илиsyms.

Обратите внимание, что sym поставляется с dplyr, но вы также можете обойтись без этого с as.symbol.

Пример использования enquo:

summarise_mean <- function(df, col) {

  variable <- enquo(col)

  df %>% summarise(mean = mean(!! variable))

}

Вывод:

summarise_mean(df, column)

  mean
1    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...