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

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

Замена всех нhive на NA:

df[df == 0] <- NA 

объяснение

1. Это не NULL что вы хотите заменить нулями. Как говорится в ?'NULL' ,

NULL представляет нулевой объект в R

который является уникальным и, я думаю, можно рассматривать как самый неинформативный и пустой объект. 1 Тогда становится неудивительно, что

 data.frame(x = c(1, NULL, 2)) # x # 1 1 # 2 2 

То есть, R не оставляет места для этого нулевого объекта. 2 Между тем, глядя на ?'NA' мы видим, что

NA - логическая константа длины 1, которая содержит индикатор отсутствующего значения. NA можно принуждать к любому другому векторному типу, кроме raw.

Важно, что NA имеет длину 1, так что R резервирует для этого некоторое пространство. Например,

 data.frame(x = c(1, NA, 2)) # x # 1 1 # 2 NA # 3 2 

Кроме того, структура фрейма данных требует, чтобы все столбцы имели одинаковое количество элементов, чтобы не было «отверстий» (то есть значений NULL ).

Теперь вы можете заменить нули на NULL в кадре данных в смысле полного удаления всех строк, содержащих хотя бы один ноль. При использовании, например, var , cov или cor , это фактически эквивалентно первой замене нhive NA и установке значения use как "complete.obs" . Как правило, это неудовлетворительно, поскольку это приводит к дополнительной потере информации.

2. Вместо того, чтобы запускать какой-то цикл, в решении я использую df == 0 векторизации. df == 0 возвращает (попробуйте) матрицу того же размера, что и df , с элементами TRUE и FALSE . Кроме того, нам также разрешено передать эту матрицу подмножеству [...] (см. ?'[' ). Наконец, хотя результат df[df == 0] является совершенно интуитивным, может показаться странным, что df[df == 0] <- NA дает желаемый эффект. Оператор присваивания <- действительно не всегда настолько умный и не работает таким образом с некоторыми другими объектами, но он делает это с кадрами данных; см. ?'<-' .

1 Пустое множество в теории множеств так или иначе связано.
Еще одно сходство с теорией множеств: пустое множество является подмножеством каждого множества, но мы не оставляем для него никакого пространства.

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

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

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

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

Примерный кадр данных (бесстыдно скопированный из ответа @ Chase):

 dat xy 1 0 2 2 1 2 3 1 1 4 2 1 5 0 0 

Zeroes можно заменить NA на is.na<- function:

 is.na(dat) <- !dat dat xy 1 NA 2 2 1 2 3 1 1 4 2 1 5 NA NA 
 #Sample data set.seed(1) dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE)) #----- xy 1 0 2 2 1 2 3 1 1 4 2 1 5 0 0 #replace zeros with NA dat[dat==0] <- NA #----- xy 1 NA 2 2 1 2 3 1 1 4 2 1 5 NA NA 

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

В принципе, используйте := operator -> 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 

dplyr::na_if() – это вариант:

 library(dplyr) df <- data_frame(col1 = c(1, 2, 3, 0), col2 = c(0, 2, 3, 4), col3 = c(1, 0, 3, 0), col4 = c('a', 'b', 'c', 'd')) na_if(df, 0) # A tibble: 4 x 4 col1 col2 col3 col4     1 1 NA 1 a 2 2 2 NA b 3 3 3 3 c 4 NA 4 NA d 

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

  • Градиент из n цветов, начиная от цвета 1 и цвета 2
  • Как вы конвертируете даты / время из одного часового пояса в другой в R?
  • Выведите R-команду через что-то вроде try ()
  • Определить все объекты данного classа для дальнейшей обработки
  • Как увидеть исходный код функции R .Internal или .Primitive?
  • Как передать аргументы командной строки, когда source () R-файл
  • Разверните строки по дате с использованием даты начала и окончания
  • Lapply для добавления столбцов в каждый Dataframe в списке
  • Найти повторяющиеся значения в R
  • Использование R для отображения всех файлов с указанным расширением
  • Преобразование серийного номера excel DateTime в R DateTime
  • Давайте будем гением компьютера.