Почему мое подмножество dataframe класса 'closure'?R studio R версия 3.5.3 - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь вычислить среднее значение подмножества моего кадра данных.Однако я обнаружил, что мое подмножество возвращается в класс «замыкание», а я просто хочу, чтобы оно было вектором.Голова моего df может выглядеть следующим образом:

          Date sulfate nitrate ID
1   2002-01-01      NA      NA  8
2   2002-01-02      NA      NA  8
3   2002-01-03      NA      NA  8
4   2002-01-04      NA      NA  8
5   2002-01-05      NA      NA  8
6   2002-01-06      NA      NA  8

Есть значения, отличные от NA, как в «сульфате», так и в «нитрате», далее вниз по DF.

Я попытался установить подмножество, используя freem[загрязнитель], а не freem $ загрязнитель.Похоже, это не имеет никакого значения.

pollutantmean <- function(directory,pollutant,id = 1:332){
        means <- c()
        for(i in id){
                x <- paste(getwd(), "/", directory, "/", sprintf("%03d", i), ".csv", sep = "")
                freem <- read.csv(x)
                inte <- freem$pollutant
                print(class(frame$pollutant))
                means[i] <- mean(inte, na.rm = TRUE)


        }
        mean(means)
}

Я ожидаю, что цикл for заполнит пустой вектор "средства" средствами подмножеств всех выбранных "мониторов" (в основном это разные файлы CSV вмой ж)

1 Ответ

0 голосов
/ 03 мая 2019

Функция pollutantmean() в OP не работает со следующей ошибкой:

Error in frame$pollutant : object of type 'closure' is not subsettable

Почему?

Строка 7 содержит следующий код:

 print(class(frame$pollutant))

с опечаткой frame вместо freem. frame() - это функция в графическом пакете, которая имеет следующие последствия.

  1. Функция R также является замыканием ,
  2. Объекты типа closure не могут быть подмножеством с формой $ оператора извлечения

Поэтому R генерирует сообщение об ошибке закрытия.

Изменение строки 7 на print(class(frame$pollutant)) приводит к NULL, что вызывает вторую ошибку в коде, использование формы $ оператора извлечения с подстановкой переменной в функции.

В этой ситуации правильный оператор извлечения - [[, потому что [ вернет объект типа list(), что приведет к тому, что функция mean() вернет NA.

inte <- freem[[pollutant]] 

Обратите внимание, что эти изменения приведут к рабочей версии pollutantmean(), но эта версия не пройдет тест в курсе программирования Джона Хопкинса R на Coursera. Зачем? Код OP вычисляет невзвешенное среднее, когда для присвоения требуется взвешенное среднее.

Поскольку OP - это домашнее задание, я не буду публиковать полностью исправленную функцию pollutantmean(). Как наставник сообщества в специализации JHU Data Science, я обязан не публиковать полные решения викторин или заданий проекта. Вместо этого я отсылаю студента к Распространенным ошибкам: взвешенное и невзвешенное означает для подробного ознакомления с разницей между взвешенным и невзвешенным средним.

...