2012-06-14 3 views
76

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

+11

Я не думаю, что вы хотите/может заменить значения NULL, но NA служит этой цели в R lingo. – Chase

ответ

141

Замена 0 до NA:

df[df == 0] <- NA 
+3

Каким будет эквивалентный синтаксис для объекта data.table? – dadrivr

+2

Я вижу, что вы получили много голосов, но не думайте, что это соответствующим образом охватывает случаи краев нечисловых столбцов со значениями «0», которые не были запрошены для установки на . –

14
#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 
19

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

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

dat 

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

Нуль можно заменить на 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

Вы можете заменить 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).

+0

Я не уверен, что это верное решение. Как насчет столбцов 6 и более. Они будут сокращены. – userJT

+0

Вот почему я предложил заменить '1: 5' на' 1: ncol (df) 'в конце. Я не хотел, чтобы уравнение было слишком сложным или трудным для чтения. –

+0

, но что, если в столбцах 6 и 7 - тип данных является символом, и никакая замена не должна выполняться. В моей проблеме мне нужна замена только в столбцах с 12 по 15, но весь df имеет 21 столбец (многие из них не должны быть затронуты вообще). – userJT

20

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

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

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

Потому что кто-то попросил 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 
+1

Или 'for (j в именах (DT)); set (DT, который (DT [[j]] == 0), j, NA) '. См. [Здесь] (http://stackoverflow.com/a/7249454/4241780) для более подробного обсуждения использования data.table для поиска и замены значений. – JWilliman

0

попытка ниже

ДФ [is.na (ДФ)] < - 0

+0

Это обратное - вопрос заключается в том, как заменить 0 на NA, а не на NA с помощью 0. – Gregor

Смежные вопросы