Игнорировать NA в функции Саппи - PullRequest
5 голосов
/ 28 июня 2011

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

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

Вот моя проблема с примером таблицы данных

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)
ROCA <- data.frame (ROCA=ROCA)       # converting it just because that is the format of my original data

#Now my function
exceedes <- function (L=NULL, R=NULL, na.rm = T)
 {
    if (is.null(L) | is.null(R)) {
        print ("mycols: invalid L,R.")
        return (NULL)               
    }
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE))
  test1 <- sapply(L,function(x) if((x)> test){1} else {0})
  return (test1)
}
L=ROCA[,1]
R=.5
ROCA$newcolumn <- exceedes(L,R)
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1"

Я получаю сообщение об ошибке:

Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

Как вы, ребята, знаете, что-то не так с sapplyфункция.Любые идеи о том, как игнорировать эти NA?Я бы попробовал na.omit, если бы смог вставить все NA там, где они были раньше, но я не уверен, как это сделать.

Ответы [ 3 ]

5 голосов
/ 28 июня 2011

Нет необходимости в sapply и вашей анонимной функции, поскольку > уже векторизовано.

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

exceedes <- function (L, R, na.rm=TRUE)
{
  if(missing(L) || missing(R)) {
    stop("L and R must be provided")
  }
  test <- mean(L,na.rm=TRUE)-R*sd(L,na.rm=TRUE)
  as.numeric(L > test)
}

ROCA <- data.frame(ROCA=c(1,3,6,2,1,NA,2,NA,1,NA,4,NA))
ROCA$Exceeds1 <- exceedes(ROCA[,1],0.5)
3 голосов
/ 28 июня 2011

Это утверждение странно:

test1 <- sapply(L,function(x) if((x)> test){1} else {0})

Попробуйте:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0))
2 голосов
/ 28 июня 2011

Хотите ли вы NA: s в результате?То есть, вы хотите, чтобы строки выстраивались в линию?

похоже, просто возвращение L > test будет работать тогда.И добавление столбца также может быть упрощено (я подозреваю, что "Exeedes1" находится где-то в переменной).

exceedes <- function (L=NULL, R=NULL, na.rm = T)
 {
    if (is.null(L) | is.null(R)) {
        print ("mycols: invalid L,R.")
        return (NULL)               
    }
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE))

    L > test
}
L=ROCA[,1]
R=.5
ROCA[["Exceedes1"]] <- exceedes(L,R)
...