Петля "ifelse" в том числе NA - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу запустить цикл, используя ifelse() и включая NA в R. Вот пример моего набора данных с именем DATA:

[,1]   [,2]    [,3]    [,4]
ID1     NA      NA      NA
ID2     0       0       0
ID3     1       1       1
ID4     0       0       1
ID5     1       1       0
ID6     0       NA      1
ID7     NA      0       0
ID8     NA      1       1

По сути, я хочу добавить новыйстолбец в конце, используя эти критерии:

  • Если в столбце 2 есть хотя бы один «1», то 3 или 4 => 1
  • Если в «NO» НЕТ «1»столбец 2, 3 или 4, но по крайней мере один «0» => 0
  • Если в столбце 2, 3 или 4 есть только «NA» => НИЧЕГО

Iдумал использовать что-то подобное, но это не работает.Он возвращает:

"NA" if there is no "1", but at least one "0", instead of
"NOTHING"

Пример для строки 6:

*ifelse(any((DATA[6,c(2:4)])==1), "1", ifelse(any((DATA[6,c(2:4)])==0), "0",
"NOTHING"))*

Я действительно не хочу возвращать "НИЧЕГО" .В действительности я хочу "NA" , но чтобы проверить, был ли "NA" результатом чего-то, что не работает, я использовал "НИЧЕГО".Я также хочу зациклить все для каждой строки в моем наборе данных, но я не очень хорош в этом.

1 Ответ

0 голосов
/ 16 ноября 2018
rowSums.na <-
    function(x, na.rm = T){

        suma <- rowSums(x, na.rm = na.rm)
        ind  <- apply(x, 1, function(el){ all(is.na(el)) })

        suma[ind] <- NA

        return(suma)
}

df1$newCol<- +(rowSums.na(df1[,2:4]) > 0)

#> df1$newCol
#[1] NA  0  1  1  1  1  0  1

  • df1 - ваши данные.
  • normal rowSums / sum возвращает 0, когда все значения NA.Большая ошибка ИМО.Eval:

    1. rowSums(matrix(NA, 3, 3), na.rm = T)
    2. rowSums.na(matrix(NA, 3, 3))
  • +( ... ) преобразует логическое значение в числовой тип.запустите +( c(TRUE, FALSE, TRUE) ) в консоли R.

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