NA 0 = 0, NA 1 = 1, NA NA = NA in R

#r #na

Вопрос:

У меня есть фрейм данных с некоторыми NAs следующим образом:

 set.seed(1)
M<-matrix(sample(0:1,100,replace=TRUE),ncol=10)
M <- as.data.frame(M)
M[3,1]<-NA
M[10,5]<-NA
M[10,6]<-NA
M[8,10]<-NA
 

Я хочу суммировать каждые две колонки следующим образом:
M_final = M[c(TRUE,FALSE)] M[c(FALSE,TRUE)]

Но я хочу, чтобы NA был в M_final только при добавлении двух NAs. Поэтому я ожидаю, что результат будет:

    V1 V3 V5 V7 V9
1   0  1  2  1  1
2   1  1  1  2  1
3   0  0  1  1  1
4   0  1  2  1  1
5   1  0  1  1  0
6   1  0  1  2  1
7   1  2  2  2  0
8   1  0  2  0  1
9   2  1  1  1  1
10  1  2 NA  2  1
 

Есть какие-нибудь идеи??
Спасибо!!

Ответ №1:

Для этого можно написать пользовательскую функцию.

 add_NA <- function(x, y) ifelse(is.na(x) amp; is.na(y), NA, rowSums(cbind(x, y), na.rm = TRUE))
 

Используйте mapply , чтобы наносить их парами

 mapply(add_NA, M[c(TRUE,FALSE)], M[c(FALSE,TRUE)])

#.     V1 V3 V5 V7 V9
# [1,]  0  1  2  1  1
# [2,]  1  1  1  2  1
# [3,]  0  0  1  1  1
# [4,]  0  1  2  1  1
# [5,]  1  0  1  1  0
# [6,]  1  0  1  2  1
# [7,]  1  2  2  2  0
# [8,]  1  0  2  0  1
# [9,]  2  1  1  1  1
#[10,]  1  2 NA  2  1