У меня есть dataframe с некоторыми числовыми столбцами. Некоторая строка имеет значение 0, которое в статистическом анализе должно считаться нулевым. Каков самый быстрый способ заменить все значение 0 на NULL в R?
Замените все значения 0 на NA
Ответ 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)
.