dplyr :: sumrize () в функции R завершается с ошибкой «аргумент не числовой c или логический» - PullRequest
0 голосов
/ 23 апреля 2020

Я относительно новичок в R и пытаюсь написать свою первую многошаговую функцию. По сути, я хочу создать функцию, которая берет каталог и выполняет поиск в этом каталоге, чтобы найти определенный столбец (в данном случае, загрязнитель). Затем найдите среднее значение этого столбца и удалите NA. Это то, что я до сих пор:

pollutantmean <- function(directory , pollutant , min_id = 1, max_id = 332) {

setwd(directory)

dirdata <- list.files(path=getwd() , pattern='*.csv' , full.names = TRUE) %>% lapply(read_csv) %>% bind_rows

specdata <- dirdata %>% filter(between(ID,min_id,max_id))

polspecdata <- specdata %>% select(pollutant)

polspecdatamean <- polspecdata %>% summarize(mean_pollutant=mean(pollutant,na.rm=TRUE))
} 

Я чувствую, что я так близко, но в результате появляется ошибка: Предупреждение: In mean.default (pollutant, na.rm = TRUE): аргумент не является цифрой c или логичным: возвращая NA. Я считаю, что ошибка вызвана тем, что класс столбца col_double. Это может быть связано с тем, что dirdata создается из нескольких файлов CSV. Любая помощь будет принята с благодарностью. Спасибо!

Это данные: zipfile_data

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Если вы передаете переменную pollutant в виде строки, попробуйте использовать функцию ниже.

library(tidyverse)

pollutantmean <- function(directory , pollutant , min_id = 1, max_id = 332) {

  dirdata <- list.files(path=directory, pattern='*.csv' , full.names = TRUE) %>% 
                  map_df(read_csv)
   dirdata %>% 
      filter(between(ID,min_id,max_id)) %>%
      summarise(mean_pollutant= mean(!!sym(pollutant),na.rm=TRUE))
} 

Таким образом, вы можете назвать его как

pollutantmean('/path', 'sulfate', 1, 10)

Используя !!sym, мы оцениваем sulfate как столбец, а не как строку.

0 голосов
/ 23 апреля 2020

Код в исходном сообщении терпит неудачу, потому что он использует dplyr внутри функции, но не использует dplyr функции цитирования . Когда мы запускаем код через отладчик RStudio и останавливаемся на строке 7, мы видим следующее:

enter image description here

dplyr не отображает аргумент функции в пределах mean(pollutant, na.rm = TRUE), как и ожидалось, поэтому строка 9 не работает. Сбой функции mean(), поскольку аргумент pollutant отображается как текстовая строка, а не как столбец во фрейме данных polspecdata.

Один из способов исправить ошибку - настроить строку 9 для явной ссылки на фрейм данных, переданный из предыдущей функции через оператор канала %>%, используя форму [[ оператора извлечения для использования строки версия аргумента.

polspecdatamean <- polspecdata %>% summarize(mean_pollutant=mean(.data[[pollutant]],na.rm=TRUE))

Наконец, поскольку функция должна возвращать среднее значение в родительскую среду, мы добавляем печать объекта, созданного в строке 9, в конце функции.

polspecdatamean

Поскольку это задание по программированию для курса Университета Джона Хопкинса R Programming на Coursera, я не буду публиковать полный ответ, потому что это нарушает Кодекс Honor Coursera.

Упрощение решения

Как только данные отфильтрованы в строке 5, функция может просто вернуть среднее значение следующим образом.

mean(specdata[[pollutant]],na.rm=TRUE)

Выводы

Для этого конкретного задания использование dplyr делает назначение более трудным, чем это должно быть из-за того, что dplyr использует нестандартную оценку и dplyr даже не рассматривается в учебной программе JHU до третьего курса в последовательности.

В коде есть некоторые другие тонкие недостатки, исправление которых мы оставим в качестве упражнения для читателя. Например, учитывая требования назначения, функция должна иметь возможность обрабатывать следующие входные данные:

pollutantmean("specdata","sulfate",23) # calc mean for sensor 23
pollutantmean("specdata","nitrate",70:72) # calc mean for sensors 70 - 72 
...