2012-06-14 11 views
76
으로 바꿉니다.

일부 숫자 열이있는 데이터 프레임이 있습니다. 일부 행은 통계 분석에서 0으로 간주되어야하는 0 값을가집니다. R에서 모든 0 값을 NULL로 바꾸는 가장 빠른 방법은 무엇입니까?모든 0 값을 NA

+11

를/NULL 값으로 대체 할 수 있지만 NA는 R 링고에서 그 목적을 수행합니다. – Chase

답변

141

NA 0 장착 :

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 

0을로 바꿀 수 있습니다. is.na<- 기능에 의해 83,210 : 당신은 숫자 필드에 NA0을 대체 할 수

is.na(dat) <- !dat 


dat 

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

(즉, 요소 같은 것들을 제외)하지만 열별로 작동합니다

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 : 5'를'1 : ncol (df)'로 대체 할 것을 제안했다. 방정식을 지나치게 복잡하거나 읽기 어렵게 만들고 싶지 않았습니다. –

+0

하지만 6 및 7 열의 경우 데이터 유형이 char이며 대체가 수행되지 않아야합니다. 내 문제는 필자는 12-15 열에서만 교체가 필요하지만 전체 df는 21 개의 열을 가지고있다. – userJT

20

귀하의 data.frame은 다른 데이터 유형이 혼합되어 있으며 모든 열을 수정할 필요가 없다고 가정 해 보겠습니다.

는 수행 (총 21) 18 만 열 (12)을 수정하려면이

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에서 이름 (DT)); DT ([DT [j] == 0), j, NA)'로 설정한다. data.table을 사용하여 값을 찾아 바꾸는 방법에 대한 자세한 내용은 [here] (http://stackoverflow.com/a/7249454/4241780)를 참조하십시오. – JWilliman

0

시도

DF [is.na (DF)] < 아래 - -

기본적으로

:= 연산자를 사용하여 내가 원하는 생각하지 않는다 0

+0

이것은 역방향입니다. 문제는 0을 NA로 바꾸고 NA를 0으로 바꾸는 것입니다. – Gregor