Обмен NA в матрице с одним значением по умолчанию, если строка "пуста" - PullRequest
0 голосов
/ 31 января 2019

У меня огромная матрица с несколькими столбцами и строками.Он содержит числовые значения и NA.

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

Теперь к моему вопросу:

Существует ли быстрая функция, которую я могу использовать в своей матрице, чтобы заменить NA в этих строках одним и тем же значением (скажем, 0 или 99, это не имеет значения!)?Но - важно- ТОЛЬКО для строк, которые пусты (только NA)?

Ответы [ 3 ]

0 голосов
/ 31 января 2019
mdat
          C.1 C.2 C.3
row1        1   2   3
row2       11  12  13
rowpartNA   2   2  NA
rowNA      NA  NA  NA

all.na.fun<- function(x)all(is.na(x))
apply(mdat, 1, all.na.fun)
     row1      row2 rowpartNA     rowNA 
    FALSE     FALSE     FALSE      TRUE 
> all.na.fun<- function(x)all(is.na(x))
(all.na.row<-apply(mdat, 1, all.na.fun))
     row1      row2 rowpartNA     rowNA 
    FALSE     FALSE     FALSE      TRUE 
mdat[all.na.row,] <-99
mdat
          C.1 C.2 C.3
row1        1   2   3
row2       11  12  13
rowpartNA   2   2  NA
rowNA      99  99  99
0 голосов
/ 31 января 2019

Матрица:

m <- matrix(c(1,2,3,4,
             NA,NA,NA,NA,
             NA, 1, 2, 3,
             1,2, NA, 4, 
             4,2,1,3),  nrow=5, byrow = T )

Синтаксис:

m[which(rowSums(is.na(m))==ncol(m)),]=999

Вывод:

> m
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]  999  999  999  999
[3,]   NA    1    2    3
[4,]    1    2   NA    4
[5,]    4    2    1    3
0 голосов
/ 31 января 2019

Вам просто нужно проиндексировать строки, которые все являются NA, а затем заменить их присваиванием.Вы можете достичь этого с помощью is.na(), rowSums() и ncol().Я выписал их все ниже, чтобы вы могли увидеть работу:

x <- rbind(c(1, 2, NA), c(NA, NA, NA), c(NA, 5, 6), c(7, NA, 9))
x
is.na(x)
rowSums(is.na(x))
ncol(x)
# This is the single line that does all the work
x[rowSums(is.na(x)) == ncol(x),] <- 99
x

Вывод:

     [,1] [,2] [,3]
[1,]    1    2   NA
[2,]   NA   NA   NA
[3,]   NA    5    6
[4,]    7   NA    9
      [,1]  [,2]  [,3]
[1,] FALSE FALSE  TRUE
[2,]  TRUE  TRUE  TRUE
[3,]  TRUE FALSE FALSE
[4,] FALSE  TRUE FALSE
[1] 1 3 1 1
[1] 3
     [,1] [,2] [,3]
[1,]    1    2   NA
[2,]   99   99   99
[3,]   NA    5    6
[4,]    7   NA    9
...