Замените все значения 0 на NA

У меня есть dataframe с некоторыми числовыми столбцами. Некоторая строка имеет значение 0, которое в статистическом анализе должно считаться нулевым. Каков самый быстрый способ заменить все значение 0 на NULL в R?

Ответ 1

Замена 0 на NA:

df[df == 0] <- NA

Ответ 2

Альтернативный способ без функции [<-:

Образец данных dat (бесстыдно скопирован из ответа @Chase):

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

Zeroes можно заменить на NA функцией is.na<-:

is.na(dat) <- !dat


dat

   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

Ответ 3

Позвольте мне предположить, что ваш data.frame представляет собой смесь разных типов данных, и не все столбцы необходимо изменить.

чтобы изменить только столбцы с 12 по 18 (из общего числа 21), просто сделайте это

df[, 12:18][df[, 12:18] == 0] <- NA

Ответ 4

#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE))
#-----
  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

#replace zeros with NA
dat[dat==0] <- NA
#-----
   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

Ответ 5

Поскольку кто-то спросил версию Data.Table этого и потому что данное решение data.frame не работает с data.table, я предоставляю решение ниже.

В принципе, используйте оператор :=DT[x == 0, x := NA]

library("data.table")

status = as.data.table(occupationalStatus)

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1  0
 8:      8           1  0
 9:      1           2 19
10:      2           2 40


status[N == 0, N := NA]

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1 NA
 8:      8           1 NA
 9:      1           2 19
10:      2           2 40

Ответ 6

Вы можете заменить 0 на NA только в числовых полях (т.е. исключая такие вещи, как факторы), но он работает по принципу "один за столбцом":

col[col == 0 & is.numeric(col)] <- NA

С помощью функции вы можете применить ее ко всему кадру данных:

changetoNA <- function(colnum,df) {
    col <- df[,colnum]
    if (is.numeric(col)) {  #edit: verifying column is numeric
        col[col == -1 & is.numeric(col)] <- NA
    }
    return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))

Хотя вы можете заменить 1:5 на количество столбцов в вашем фрейме данных или с помощью 1:ncol(df).