0 değerin tümünü NA olarak değiştir


145

Bazı sayısal sütunları olan bir veri çerçevesi var. Bazı satırlar istatistiksel analizde null olarak kabul edilmesi gereken 0 değerine sahiptir. 0'daki tüm 0 değerlerini R yerine NULL olarak değiştirmenin en hızlı yolu nedir?


17
İstediğiniz / NULL değerleri ile değiştirebilirsiniz düşünüyorum, ama NA R lingo bu amaca hizmet eder.
Chase

Yanıtlar:


244

Tüm sıfırları NA olarak değiştirmek:

df[df == 0] <- NA



açıklama

1.NULL Sıfırları değiştirmek istediğiniz şey değildir . Dediği gibi ?'NULL',

NULL, R'deki null nesneyi temsil eder

Bu benzersiz ve sanırım, en bilgisiz ve boş nesne olarak görülebilir. 1 O zaman o kadar şaşırtıcı değil ki

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

Yani, R bu boş nesne için yer ayırmaz. 2 Bu arada, şunu ?'NA'görüyoruz ki

NA, eksik bir değer göstergesi içeren uzunluk 1'in mantıksal sabitidir. NA ham hariç herhangi bir vektör türüne zorlanabilir.

Önemli olarak, NAR uzunluğu için yer ayırması için uzunluk 1'dir. Örneğin,

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

Ayrıca, veri çerçevesi yapısı tüm sütunların aynı sayıda öğeye sahip olmasını gerektirir, böylece "delik" (yani NULLdeğerler) olamaz .

Artık sıfırları, NULLen az bir sıfır içeren tüm satırları tamamen kaldırmak anlamında bir veri çerçevesinde değiştirebilirsiniz . Kullanırken, örneğin var, covya da cor, bu ilk ile sıfır yerine aslında eşdeğerdir NAve değerini ayarlayarak useolarak "complete.obs". Bununla birlikte, tipik olarak, bu ekstra bilgi kaybına yol açtığı için tatmin edici değildir.

2. Bir çeşit döngü çalıştırmak yerine, çözümde df == 0vektörleştirmeyi kullanıyorum. df == 0döner (denemek) ile aynı boyutta bir matris dfgirdileri ile TRUEve FALSE. Ayrıca, bu matrisi alt kümeye geçirmemize izin verilir [...](bkz. ?'['). Son olarak, sonucu df[df == 0]tamamen sezgisel olsa da df[df == 0] <- NA, istenen etkiyi veren garip görünebilir . Atama operatörü <-aslında her zaman çok akıllı değildir ve diğer bazı nesnelerle bu şekilde çalışmaz, ancak veri çerçevelerinde bunu yapar; bakın ?'<-'.


1 Küme teorisindeki boş küme bir şekilde ilişkilidir.
2 Küme teorisine bir başka benzerlik: boş küme her kümenin bir alt kümesidir, ancak bunun için yer ayırmayız.


3
Bir data.table nesnesi için eşdeğer sözdizimi ne olurdu?
itpetersen

6
Çok oy aldınız ama bunun <NA> olarak ayarlanması istenmeyen "0" değerlerine sahip sayısal olmayan sütunların kenar durumlarını uygun şekilde kapsadığını düşünmüyorum.
IRTFM

33

Data.frame'inizin farklı veri türlerinin bir karışımı olduğunu varsayalım ve tüm sütunların değiştirilmesi gerekmez.

yalnızca 12 ile 18 arasındaki sütunları (toplam 21'in) değiştirmek için bunu yapmanız yeterlidir

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

Bu benim için çalışıyor, kabul edilen cevap çalışmıyor
Patrick Coulombe

23

[<-İşlevsiz alternatif bir yol :

Örnek bir veri çerçevesi dat(@ Chase'in cevabından utanmadan kopyalandı):

dat

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

Sıfır ile değiştirilebilir NAtarafından is.na<-fonksiyonu:

is.na(dat) <- !dat


dat

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

22

dplyr::na_if() bir seçenektir:

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 
  <dbl> <dbl> <dbl> <chr>
1     1    NA     1 a    
2     2     2    NA b    
3     3     3     3 c    
4    NA     4    NA d

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

12

Birisi bunun Data.Table sürümünü istedi ve verilen data.frame çözümü data.table ile çalışmadığından, aşağıdaki çözümü sağlıyorum.

Temel olarak, :=operatörü kullanın ->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

2
Veya for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA). Değerleri bulmak ve değiştirmek için data.table kullanımı hakkında daha ayrıntılı bir tartışma için buraya bakın .
JWilliman

4

Sen yerini alabilir 0ile NAyalnızca sayısal alanlarda (yani faktörlere gibi şeyler hariç), ama bir sütun bazında sütunda bazında çalışır:

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

Bir işlevle, bunu tüm veri çerçevenize uygulayabilirsiniz:

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))

Bununla 1:5birlikte, veri çerçevenizdeki sütun sayısıyla veya ile değiştirebilirsiniz 1:ncol(df).


Bunun doğru bir çözüm olduğundan emin değilim. Sütun 6 ve daha fazlası hakkında. Kesilecekler.
userJT

Ben değiştirilmesi önerdi yüzden 1:5ile 1:ncol(df)sonunda. Denklemi aşırı derecede karmaşık veya okumayı zorlaştırmak istemedim.
Alium Britt

ancak 6 ve 7 sütunlarında - veri türü char ise ve değiştirilmemelidir. Benim sorunumda, sadece 12 ila 15 sütunlarında değiştirilmesi gerekiyor ama tüm df 21 sütun var (birçok dokunulmamalıdır).
userJT

Veri çerçevesi için sadece değişebilir 1:5sizin gibi değişti istediğiniz sütun numaralarına 12:15, ama bunu yalnızca sayısal sütunlar etkileyeceğini onaylayın istiyorsa o zaman sadece bu gibi bir if açıklamada fonksiyonunun ikinci satırını sarın: if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }.
Alium Britt

0

Herkes buraya tersini arıyor google üzerinden gelmesi durumunda (yani bir data.frame tüm NAs nasıl 0 ile değiştirilir), cevap

df[is.na(df)] <- 0

VEYA

Dplyr / tidyverse kullanma

library(dplyr)
mtcars %>% replace(is.na(.), 0)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.