Проблема со значениями NA в R

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

У меня есть довольно простая функция для вычисления средних значений x столбцов данных:

columnmean <-function(y){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i])
  }
    means 
}

Я в RStudio и тестирую его, используя включенный набор данных «качества воздуха». Когда я загружаю набор данных AQ и запускаю свою функцию:

data("airquality")
columnmean(airquality)

Я вернусь:

NA NA 9.957516 77.882353 6.993464 15.803922

Потому что первые две переменные в AQ содержат NA. К, круто. Я хочу подавить NA, чтобы R игнорировал их и все равно запускал функцию.

Я читаю, что могу указать это с помощью na.rm = TRUE, например:

columnmean(airquality, na.rm = TRUE)

Но когда я это делаю, я получаю сообщение об ошибке:

«Ошибка в средн. Столбце (качество воздуха, na.rm = TRUE): неиспользованный аргумент (na.rm = TRUE)»

Я повсюду читаю, что мне просто нужно включить na.rm = TRUE, и функция запустится и проигнорирует значения NA ... но я продолжаю получать эту ошибку. Я также пробовал use = "complete" и все, что смог найти.

Два предостережения:

Я знаю, что могу создать вектор с помощью is.na, а затем подмножество данных, но мне не нужен этот дополнительный шаг, я просто хочу, чтобы он запускал функцию и игнорировал недостающие данные.

Я также знаю, что могу указать IN функцию, чтобы игнорировать или не игнорировать, но я хотел бы выбрать способ игнорировать / не игнорировать на лету, на основе действия за действием, вместо того, чтобы он был частью самой функции .

Помощь приветствуется. Всем спасибо.


person Adam_S    schedule 05.04.2017    source источник
comment
Вы должны включить na.rm=TRUE в mean   -  person akrun    schedule 05.04.2017
comment
Для этого в R уже есть встроенная функция: colMeans(airquality, na.rm=TRUE)   -  person MrFlick    schedule 05.04.2017
comment
@MrFlick - да, я знаю, я учусь писать функции на R, поэтому я выбрал очень простой вариант, который, как я знаю, легко могу проверить.   -  person Adam_S    schedule 05.04.2017


Ответы (3)


Мы можем включить na.rm = TRUE в mean

columnmean <-function(y){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i], na.rm = TRUE)
  }
   means 
}

Если нам нужно использовать аргумент na.rm иногда как ЛОЖЬ, а иногда как ИСТИНА, укажите это в аргументе 'columnmean'

columnmean <-function(y, ...){
    nc <- ncol(y)
  means <- numeric(nc)
   for(i in 1:nc) {
     means[i] <- mean(y[,i], ...)
   }
   means 
  }

columnmean(df1, na.rm = TRUE)
#[1] 1.5000000 0.3333333
 columnmean(df1, na.rm = FALSE)
#[1] 1.5  NA

данные

 df1 <- structure(list(num = c(1L, 1L, 2L, 2L), x1 = c(1L, NA, 0L, 0L
 )), .Names = c("num", "x1"), row.names = c(NA, -4L), class = "data.frame")
person akrun    schedule 05.04.2017
comment
Спасибо за ваш ответ. Я читал об этой опции, но в идеале я хочу иметь возможность указать в вызове, игнорировать или нет ... иногда я хочу игнорировать NA, иногда нет. Это не вариант? - person Adam_S; 05.04.2017
comment
@Adam_S Тогда вы можете сделать это в аргументе функции с 3 точками ..., а также в mean - person akrun; 05.04.2017
comment
Да, идеально. Большое спасибо за то, что нашли время ответить на довольно простой вопрос! - person Adam_S; 05.04.2017

Вы должны использовать этот параметр в вызове функции mean:

columnmean <-function(y){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i], na.rm = TRUE)
  }
    means 
}

columnmean - это настраиваемая функция, и у нее нет этого параметра.

person Vince    schedule 05.04.2017
comment
Спасибо за ваш ответ. Другой способ сказать то, что вы говорите ... поскольку это функция, которую я написал, я не могу указать игнорировать NAs Y / N, когда я ее вызываю, я должен указать это, когда я пишу функцию? Иногда я хочу игнорировать НА, иногда нет. Это не вариант? - person Adam_S; 05.04.2017

Вы можете передать параметр na.rm своей функции:

columnmean <- function(y, na.rm = FALSE){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i], na.rm = na.rm)
  }
  means 
}

data("airquality")
columnmean(airquality, na.rm = TRUE)
#[1] 42.129310 185.931507   9.957516  77.882353   6.993464  15.803922

columnmean(airquality)
#[1]        NA        NA  9.957516 77.882353  6.993464 15.803922

Но я рекомендую искать альтернативный код для циклов:

column_mean <- function(y, na.rm = FALSE) {
  sapply(y, function(x) mean(x, na.rm = na.rm))
}

column_mean(airquality, na.rm = TRUE)
#     Ozone    Solar.R       Wind       Temp      Month        Day 
# 42.129310 185.931507   9.957516  77.882353   6.993464  15.803922
person Enrique Pérez Herrero    schedule 05.04.2017