2012-06-14 28 views
76
için değiştir

Bazı sayısal sütunlara sahip bir veri çerçevem ​​var. Bazı satırlar, istatistiksel analizde null olarak düşünülmesi gereken bir 0 değerine sahiptir. R'de tüm 0 değerini NULL olarak değiştirmenin en hızlı yolu nedir?Tüm 0 değerlerini NA

+11

/NULL değerleriyle değiştirebilir, ancak NA bu amacı R lingo'da sunar. – Chase

cevap

141

NA 0 değiştirilmesi:

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

Eşdeğer sözdizimi bir data.table nesnesi için ne olurdu? – dadrivr

+2

Çok sayıda oy aldığınızı görüyorum ancak bunun olarak ayarlanması talep edilmeyen "0" değerleriyle sayısal olmayan sütunların kenar durumlarını uygun şekilde kapladığını düşünmüyorum. –

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

[<- fonksiyonu olmayan bir alternatif yol:

(shamelessly Chase'in yanıt @ kopyalanmış) örnek bir veri çerçevesi dat:

dat 

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

Sıfırlarile değiştirilebilir is.na<- işlev tarafından 83.210: Yalnızca sayısal alanlarda NA ile 0 yerini alabilir

is.na(dat) <- !dat 


dat 

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

(yani faktörlere gibi şeyler) hariç olmak üzere, ama bir sütun bazında sütunda bazında çalışır:

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

bir fonksiyonu ile, bütün veri çerçevesine bu 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)) 

değiştirmek olabilir rağmen Veri çerçevenizdeki sütun sayısı veya 1:ncol(df) ile 1:5.

+0

Bunun doğru çözüm olduğundan emin değilim. 6 ve daha fazlası sütunlara ne dersiniz? Kesilecekler. – userJT

+0

Bu yüzden '1: 5' yerine '1: ncol (df) 'ile değiştirmeyi önerdim. Denklemi aşırı karmaşık veya zor okumak istemedim. –

+0

ama 6 ve 7 sütunlarında - veri türü char ve değiştirme yapılmamalıdır. Benim sorunumda, sadece 12 ila 15 sütunlarda değiştirmeye ihtiyacım var ama bütün df 21 sütun içeriyor (pek çoğuna dokunulmamalıdır). – userJT

20

Veri dosyanızın farklı veri türleri karışımı olduğunu ve tüm sütunların değiştirilmesinin gerekmediğini varsayalım.

sadece bunu, (toplam 21), 18 tek sütunlar 12 değiştirmek için bu

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

birisi bunun Data.Table sürümü için istedi ve verilen nedeniyle data.frame çözüm değildir çünkü data.table ile çalışıyorum, aşağıdaki çözümü sağlarım. >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

Veya 'için (j in names (DT)); set (DT, hangi (DT [[j]] == 0), j, NA) '. Değerleri bulmak ve değiştirmek için data.table kullanma hakkında daha ayrıntılı bir tartışma için bkz. [Here] (http://stackoverflow.com/a/7249454/4241780). – JWilliman

0

deneyin

df [is.na (df)] < altında - -

Temelde

, := operatörünü kullanmak İstediğin sanmıyorum 0

+0

Bu geriye doğru - soru 0 ile NA değil, NA ile 0 nasıl değiştirilir. – Gregor

İlgili konular