R - доступ к именам столбцов фрейма данных, переданных как строки в аргументе функции - PullRequest
1 голос
/ 26 мая 2020

с данными, как показано ниже

text = "
date,a,b
12/2/2019,18.1,0.017741935
12/2/2019,18.2,0.020967742
12/9/2019,16.7,0.020322581
12/9/2019,16.9,0.019677419
12/3/2019,18.1,0.017741935
12/3/2019,18.8,0.020967742
12/10/2019,16.2,0.020322581
12/10/2019,16.1,0.019677419
"
df1 = read.table(textConnection(text), sep=",", header = T)

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

dplyrGgFn = function(df, colNameX, colNameY) {

  # get average Y value for each x value point to be used
  df = df %>%
    select(colNameX, colNameY) %>%
    mutate(colNameX = round(colNameX,0)) %>%
    group_by(colNameX) %>%
    summarise(colNameY = mean(colNameY))

  # 
  return(
    ggplot(df, aes_string(x=colNameX, y=colNameY)) + 
      geom_point(aes(color = "blue"))
  )

}

И вызывает как dplyrGgFn(df1, "a", "b")

Очевидно, эта функция выдает ошибку, и, как вы можете см. проблема с доступом к переменным имени столбца, переданным в виде строк при вызове функции.

Error in round(colNameX, 0) : 
  non-numeric argument to mathematical function 

каков рекомендуемый подход к обработке строк, переданных в качестве аргументов для имен столбцов? ищу общий c ответ, поскольку он может быть применим для нескольких случаев.

Обновление:

пользователь @Onyambu прокомментировал, что в качестве начальной версии используется нефункциональная версия точка - добавление этого.

df1 = df1 %>%
    select(a, b) %>%
    mutate(a = round(a,0)) %>%
    group_by(a) %>%
    summarise(b = mean(b))

ggplot(df1, aes(x=a, y=b)) + 
  geom_point(aes(color = "blue"))

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Я изменил group_by (y) на group_by (x), похоже, это то, что вы намеревались сделать. В противном случае это неясно (как также упоминалось в комментарии).

Следующий код должен помочь вам понять, как передавать имена переменных dplyr код внутри функций.

dplyrGgFn = function(df, colNameX, colNameY) {

  # get average Y value for each x value point to be used
  df = df %>%
    select(!!colNameX, !!colNameY) %>%
    mutate(!!colNameX := round(!!as.name(colNameX), 0)) %>%
    group_by(!!as.name(colNameX)) %>%
    summarise(!!colNameY := mean(!!as.name(colNameY)))
  # 
  return(
    ggplot(df, aes_string(x=colNameX, y=colNameY)) + 
      geom_point(aes(color = "blue"))
  )
}
1 голос
/ 26 мая 2020

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

library(dplyr)
library(rlang)
library(ggplot2)

dplyrGgFn = function(df, colNameX, colNameY) {
    x_col <- sym(colNameX)
    y_col <- sym(colNameY)
    df %>%
      group_by(!!x_col) %>%
      summarise(colNameY = mean(!!y_col)) %>%
      ggplot() + aes(!!x_col, y= !!y_col) + geom_point()
}

dplyrGgFn(df1, "a", "b")

Обратите внимание, что aes_string устарел в пользу sym, а aes(color = "blue") не делает то, что вы ожидаете.


Для передачи без кавычек переменные используют {{}}.

dplyrGgFn = function(df, colNameX, colNameY) {
  df %>%
    group_by({{colNameX}}) %>%
    summarise(colNameY = mean({{colNameY}})) %>%
    ggplot() + aes({{colNameX}}, y= {{colNameY}}) + geom_point()
}

dplyrGgFn(df1, a, b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...