2012-06-14 50 views
76

我有一個數據框和一些數字列。某些行有一個0值,在統計分析中應該將其視爲空值。什麼是最快的方式來取代R中的所有0值爲NULL?將全部0值全部替換爲不適用

+11

我不認爲你想/可以用NULL值替換,但NA在R術語中用於此目的。 – 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 

零可以替換爲NAis.na<-功能:

is.na(dat) <- !dat 


dat 

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

只能在數字領域的替代0NA(即排除之類的因素),但它工作在一列逐列基礎:

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:ncol(df)'替換'1:5'的原因。我不想讓方程過於複雜或難以閱讀。 –

+0

但是如果在第6列和第7列中 - 數據類型是char並且不應該進行替換。在我的問題中,我只需要在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 in name(DT)); (DT,其(DT [[j]] == 0),j,NA)'。有關使用data.table查找和替換值的更詳細討論,請參見[這裏](http://stackoverflow.com/a/7249454/4241780)。 – JWilliman

0

試試下面

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

+0

這是倒退 - 問題是如何用NA代替0,而不是用0代替NA。 – Gregor