모든 0 값을 NA로 교체


145

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


17
나는 당신이 원하거나 NULL 값으로 바꿀 수 있다고 생각하지 않지만 NA는 R lingo에서 그 목적을 제공합니다.
체이스

답변:


244

모든 0을 NA로 바꾸기 :

df[df == 0] <- NA



설명

1.NULL 0을 바꾸려 는 것이 아닙니다 . 이 글은 말하기를 ?'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적어도 하나의 0을 포함하는 모든 행을 완전히 제거한다는 의미에서 데이터 프레임에서 0을 대체 할 수 있습니다. 사용하는 경우, 예를 들면, var, cov, 또는 cor, 그 제 제로로 대체 실제로 동등한 NA및의 값의 설정 use등을 "complete.obs". 그러나 일반적으로 추가 정보가 손실되므로 만족스럽지 않습니다.

2. 솔루션에서 df == 0벡터화를 사용하여 일종의 루프를 실행하는 대신 . df == 0반환 (그것을 시도)와 동일한 크기의 행렬 df항목과, TRUE그리고 FALSE. 또한이 행렬을 서브셋으로 전달할 수도 있습니다 [...](참조 ?'['). 마지막으로 결과 df[df == 0]가 완벽하게 직관적이지만 df[df == 0] <- NA원하는 효과 를 주는 것은 이상하게 보일 수 있습니다 . 할당 연산자 <-는 실제로 항상 똑똑하지는 않지만 다른 객체에서는 이런 방식으로 작동하지 않지만 데이터 프레임에서는 작동합니다. 참조하십시오 ?'<-'.


1 세트 이론의 빈 세트는 어떻게 든 관련이 있습니다.
2 집합 이론과의 또 다른 유사점 : 빈 집합은 모든 집합의 부분 집합이지만 공간을 예약하지는 않습니다.


3
data.table 객체에 해당하는 구문은 무엇입니까?
itpetersen

6
많은 표를 얻었지만 <NA>로 설정하도록 요청되지 않은 값이 "0"인 숫자가 아닌 열의 경우를 적절하게 다루지 않는다고 생각합니다.
IRTFM

33

data.frame이 다른 데이터 유형의 혼합이며 모든 열을 수정해야하는 것은 아니라고 가정하겠습니다.

12-18 열 (총 21 개) 만 수정하려면 다음과 같이하십시오.

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

허용 된 답변은 그렇지 않지만
Patrick Coulombe

23

[<-기능이 없는 다른 방법 :

샘플 데이터 프레임 dat(@Chase의 답변에서 뻔뻔스럽게 복사) :

dat

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

0은 NA다음 is.na<-함수 로 대체 할 수 있습니다 .

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() 옵션입니다 :

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

누군가이 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

2
또는 for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA). data.table을 사용하여 값을 찾고 바꾸는 방법에 대한 자세한 내용은 여기 를 참조 하십시오 .
JWilliman

4

당신은 대체 할 수 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).


이것이 올바른 해결책인지 확실하지 않습니다. 6 열 이상은 어떻습니까? 그들은 잘릴 것이다.
userJT

그래서 마지막에 교체 1:5를 제안했습니다 1:ncol(df). 방정식을 지나치게 복잡하거나 읽기 어렵게 만들고 싶지 않았습니다.
Alium Britt

그러나 열 6과 7에서 데이터 유형이 char이고 대체를 수행하지 않으면 어떻게됩니까? 내 문제에서는 12 열에서 15 열까지만 교체해야하지만 전체 df에는 21 열이 있습니다 (많은 만지지 않아야합니다).
userJT

데이터 프레임의 경우 1:5와 같이 변경하려는 열 번호로을 변경할 수 12:15있지만 숫자 열에 만 영향을 미치는지 확인하려면 함수의 두 번째 줄을 if 문으로 래핑하십시오 if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }.
Alium Britt

0

누구나 구글을 통해 반대편을 찾고있는 경우 (즉, data.frame의 모든 NA를 0으로 바꾸는 방법) 대답은 다음과 같습니다.

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

또는

dplyr / tidyverse 사용

library(dplyr)
mtcars %>% replace(is.na(.), 0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.