R: Использование агрегата внутри функции, не работает - PullRequest
0 голосов
/ 14 апреля 2020

Я довольно новичок в R, поэтому извиняюсь, если ответ на этот вопрос уже существует, который я не могу найти.

Я не могу воспроизвести точную ошибку, которую я имею, с моим собственным набором данных, но так как возникает ошибка тем не менее, здесь мы go. То, что я пытаюсь сделать, - это создать функцию для вычисления среднего значения нескольких столбцов по значениям других. Допустим, что

d1 <- c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4)
d2 <- c(1:12)
d3 <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2)
df <- cbind(d1, d2, d3)

indicators_plotting1 <- function(a, b = d2, c = 1) {
  temp_data <- df %>%
    filter(d3 = c)
    for_plot <- aggregate(b ~ a, df, mean)
    plot(for_plot$b, for_plot$a)
}
indicators_plotting1(a = d1)

Хорошо работает, если я не включу бит %>% filter(d3 = c). Когда я включаю его, я получаю Ошибка в UseMethod ("filter_"): нет применимого метода для 'filter_', примененного к объекту класса "c ('matrix', 'double', 'Numberri c' ) ".

Что, когда я делаю это с набором данных, я предлагаю здесь. Когда я делаю это с моим большим и четырьмя фильтрами, я получаю Ошибка в eval (predvars, data, env): объект 'd1' не найден .

Любые мысли ? Заранее спасибо

1 Ответ

2 голосов
/ 14 апреля 2020

Рассмотрим следующую корректировку базы R с использованием формулы Dynami c с reformulate в aggregate() и plot(). Для решения ниже, вам нужно передать ссылку на столбец в виде строки. И ниже работает с именованными матрицами или фреймами данных:

indicators_plotting1 <- function(a, b = "d2", c = 1) {
  temp_data <- subset(df, d3 == c)
  for_plot <- aggregate(reformulate(a, b), temp_data, mean)
  plot(reformulate(b, a), for_plot)
}

indicators_plotting1(a = "d1")

Альтернативно однострочная функция:

indicators_plotting1 <- function(a, b = "d2", c = 1) {
  plot(reformulate(b, a), 
       aggregate(reformulate(a, b), subset(df, d3 == c), mean))
}

Онлайн-демонстрация (нажмите Run it (F8) внизу для графика)

Plot Output

...