Замените все значения 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) .

  • определить параметр $ right с переменной в R
  • Выбор только числовых столбцов из кадра данных
  • Как изменить языковые настройки в R
  • Матрица корреляции сюжетов в граф
  • Свернуть текст по группе в кадре данных
  • Ускорение производительности write.table
  • Удалите строки в R-матрице, где все данные NA
  • Разделите аргументы `...` и распределите по нескольким функциям
  • Процент% в%
  • Проверить наличие директории и создать, если не существует
  • Не удалось установить пакеты в последней версии RStudio и R версии.3.1.1
  • Interesting Posts

    Как изменить оси изображения в MATLAB, чтобы изменить направление?

    Windows Bitlocker и автоматическая разблокировка безопасности хранилища паролей

    Как изменить версию SDK?

    Как выполнить задачу на javaFX TextField при onfocus и outfocus?

    Как добавить столбец, если он не существует на PostgreSQL?

    Почему медленное поглощение WADL?

    models.py становится огромным, что является лучшим способом разбить его?

    Как запустить программу еще до запуска Windows?

    Как переименовать controller и модель рельсов в проект

    Почему Visual Studio работает в режиме «Всегда сверху»?

    HttpContext.Current.User.Identity.Name всегда string.Empty

    Загрузки HTTP / стойка после 1-5 МБ

    Как получить COM-сервер для Excel, написанный на VB.NET, установленный и зарегистрированный в списке серверов автоматизации?

    JavaScript – почему Array.prototype.fill фактически заполняет «указатель» объекта при заполнении чего-либо типа «новый объект ()»

    Участок с условными цветами на основе значений в R

    Давайте будем гением компьютера.