Как я могу использовать apply правильно в R в этом столбце данных? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть столбец данных с NA, я хочу узнать, как я могу применить apply (или lapply, sapply, ...) к столбцу.

Я пробовал с apply и lapply, но он возвращает ошибку.

Функция, которую я хочу применить к столбцу:

a.b <- function(x, y = 165){
  if (x < y)
    return('Good')
  else if (x > y)
    return('Bad')
}

столбец данных: данные $ col = 180 170 NA NA 185 185

Когда я использую приложение, я получаю:

apply(data$col, 2, a.b)
 Error in apply(data$col, 2, a.b) : 
   dim(X) must have a positive length

Я пробовал dim (data $ col), и возвращаемое значение равно NULL, и я думаю, что это из-за NA.

Я также использую lapply и получаю:

lapply(data$col, a.b)
Error in if (x < y) return("Good") else if (x > y) return("Bad") : 
  missing value where TRUE/FALSE needed

Это курс R для начинающих, поэтому я прошу прощения, если допустил некоторые ошибки. Спасибо, что нашли время, чтобы прочитать его и попытаться помочь.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

apply используется для матрицы, а не vector. Попробуйте:

a.b <- function(x, y = 165){
  if (is.na(x)){
    return("NA")
  } else if (x < y){
    return('Good')} else if (x > y){
    return('Bad')}
}
data$col=sapply(data$col,a.b)
1 голос
/ 03 апреля 2019

Здесь происходит несколько проблем:

  • apply предназначен для запуска чего-то с измерением, над которым нужно действовать, что является аргументом MARGIN.Столбец, который вы передаете apply, не имеет измерения.см. ниже:
> dim(mtcars)
[1] 32 11
> dim(mtcars$cyl)
NULL
  • apply и lapply предназначены для работы по всем столбцам (или строкам, если вы используете это поле для apply),Если вы хотите просто заменить один столбец, вы не должны использовать apply.Сделайте что-то вроде data$my_col <- my_func(data$my_col), если хотите заменить my_col результатом передачи его в my_func

  • NA, значения не возвращают TRUE или FALSEпри использовании оператора на них.Обратите внимание, что 7 < NA вернет NA.Ваш оператор if ищет значение TRUE или FALSE, но получает значение NA, следовательно, ошибка во второй попытке.Если вы хотите обрабатывать значения NA, вам может потребоваться включить это в вашу функцию с помощью is.na.

  • Ваша функция должна быть векторизована.Смотрите круг 3 R-Inferno .В настоящее время он просто вернет векторы длины 1 "Good" или "Bad".Моя догадка в том, что вы хотите, похожа на следующее (хотя не совсем то же самое, если x == y)

a.b <- function(x, y = 165){
  ifelse(x < y, "Good", "Bad")
}

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

1 голос
/ 03 апреля 2019

Вы должны быть в состоянии решить эту проблему с помощью mapply, указав значения для передачи в ваши параметры:

mapply(a.b, x = data[,'col'], y = 165)

Обратите внимание, что вам может потребоваться изменить функцию a.b.() для управления NA's.

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