programing

0 값을 모두 NA로 바꿉니다.

javamemo 2023. 6. 14. 21:37
반응형

0 값을 모두 NA로 바꿉니다.

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

모든 0을 NA로 바꾸기:

df[df == 0] <- NA



설명.

그렇지 않습니다NULL0을 대체할 항목.에 나와 있는 바와 같이?'NULL',

NULL은 R에서 Null 개체를 나타냅니다.

독특하고 가장 비정보적이고 공허한 것으로 1볼 수 있습니다.그러면 그렇게 놀랄 일은 아닙니다.

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

즉, R은 이 null 2개체에 대한 공간을 예약하지 않습니다.한편, 을 보면.?'NA'는 것을 알 수 있습니다.

NA는 결측값 지시자를 포함하는 길이 1의 논리 상수입니다.NA는 원시를 제외한 다른 벡터 유형으로 강제 적용될 수 있습니다.

건, 중하게요.NA길이가 1이므로 R은 이를 위해 약간의 공간을 확보합니다. 예:

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

구조는 " "", "구멍"(즉, 구)이 없을 수 열에 합니다.NULL값)을 입력합니다.

을 0으로 수 .NULL적어도 하나의 0을 포함하는 모든 행을 완전히 제거하는 의미에서 데이터 프레임.를 들어, 사용시, 예를 사용할 때:var,cov또는cor그것은 실제로 처음에 0을 대체하는 것과 같습니다.NA합니다.use~하듯이"complete.obs"그러나 일반적으로 이것은 추가적인 정보 손실로 이어지기 때문에 만족스럽지 못합니다.

일종의 루프를 실행하는 대신 사용하는 솔루션에서df == 0벡터화 df == 0 같크시행반렬다을환니합(try 와 같은 df ▁entries께라는 항목이 TRUE그리고.FALSE또한 이 행렬을 부분 집합으로 전달할 수 있습니다.[...])?'['. 의 는 . 마으로, 결는과입니다df[df == 0]인데, 하게 보일 수도 있습니다. 이상하게 보일 수 있습니다.df[df == 0] <- NA원하는 효과를 제공합니다. 연산자 할당자<-는 실제로 개체에서는 합니다. 를 참조하십시오. 참조?'<-'.


1 세트 이론의 빈 세트는 왠지 관련이 있는 것처럼 느껴집니다.
2 집합 이론과 또 다른 유사점: 빈 집합은 모든 집합의 부분 집합이지만, 우리는 그것을 위한 어떤 공간도 예약하지 않습니다.

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

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

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

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

다음을 제외한 다른 방법[<-함수:

샘플 데이터 프레임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
#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

누군가 데이터를 요청했기 때문입니다.테이블 버전이며, 주어진 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

구글을 통해 반대(즉, data.frame의 모든 NA를 0으로 대체하는 방법)를 찾아 여기에 도착하는 경우, 답은 다음과 같습니다.

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

OR

dplyr / tidyverse 사용

library(dplyr)
mtcars %>% replace(is.na(.), 0)

결측 데이터를 나타내는 여러 값을 가진 다양한 유형의 열을 가진 데이터 세트로 어려움을 겪고 있는 사람들을 위한 저의 기여입니다.

dat <- data_frame(numA = c(1, 0, 3, 4),
             numB = c(NA, 2, 3, 4),
             strC = c("0", "1.2", "NA", "2.4"),
             strD = c("Yes", "Yes", "missing", "No"))

이 데이터에서 숫자 열의 0을 다음으로 바꾸려고 합니다.NA문자/문자열 값의 'NA' 및 '누락' 값뿐 아니라NA의 'NA'를 확인합니다.strC열이 원하는 문자 형식 값이 아닙니다.NA.

dat
# A tibble: 4 x 4
  numA   numB  strC  strD   
  <dbl>  <dbl> <chr> <chr>  
1     1     NA 0     Yes    
2     0      2 1.2   Yes    
3     3      3 'NA'  missing
4     4      4 2.4   No 

첫째, 분명한 경우, 문자 열을 숫자 값으로 변환할 때 숫자가 아닌 문자열 값은 다음과 같이 강제됩니다.NA.

as.numeric(dat$strC)
[1] 0.0 1.2  NA 2.4 

인덱싱을 사용한 응답:

dat[dat == "NA" | dat =="missing"] <- NA

그러나 숫자와 문자 0을 모두 0으로 변경하므로 0에 사용하지 마십시오.NA그 이유는"0" == 0돌아온다TRUER로

dplyr::na_if 메서드:

library(dplyr)

dat %>%
  lapply(na_if, y = "missing") %>%
  lapply(na_if, y = "NA") %>%
  lapply(na_if, y = 0) %>%  # DONT DO THIS! It converts string 0s to NA as well!
  data.frame()

신청합니다.na_if각 데이터 열에 대한 함수입니다.부터na_if여러 값을 변환할 수 없습니다.NA우리는 각 값이 변환될 코드의 여러 줄을 작성해야 합니다.NA하지만, 이 기능을 사용하는 것은 간단합니다.0와 문자를 합니다.0에 끼워 넣다.NA우리는 다른 것을 해야 합니다!

na_if 함수와 함께 method에 걸쳐 mutate 사용:

이것이 제가 가장 좋아하는 해결책입니다.서는 열 하고 열 유형을 적용합니다.na_if필요에 따라 기능합니다. 캐터릭.0 값은 모두 원는모값로변반면는되, 대지않음환손이을로 됩니다.NA.

dat %>%
  mutate(across(where(is.numeric), ~na_if(., 0))) %>%
  mutate(across(where(is.character), ~na_if(., "NA"))) %>%
  mutate(across(where(is.character), ~na_if(., "missing")))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No 

마내침.nariar할 수 .

nariar한 다한제소최패근니다입키지개는하품양을▁▁aduces다▁intro▁of▁package▁variety를 소개하는 최근 패키지입니다.replace_with_기능들.

library(naniar)

' 을 든 'NA' 및 '락' 값다누바꿉 '다니로'로 바꿉니다.NA:

dat %>%
  replace_with_na_all(~.x %in% c("NA", "missing"))

하지만 만약 당신이 이것을 사용한다면.0 0을 s, 0로잘변환다니합못여전을,▁the▁s다▁0로 잘못 변환합니다.NA:

dat %>%
  replace_with_na_all(~.x %in% c(0, "NA", "missing"))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA NA    Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No
#strC's first element should not be NA here!

따라서 다음과 같은 경우 replace_with_na_를 사용하여 열 유형을 지정해야 합니다.

dat %>%
  replace_with_na_if(is.character, ~.x %in% c("NA", "missing")) %>%
  replace_with_na_if(is.numeric, ~.x %in% c(0))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No

우리는 원하는 결과를 얻었습니다.이 모든 것이 도움이 되길 바랍니다 :)

▁you▁can있습수를 대체할 수 있습니다.0와 함께NA숫자 필드에서만(예: 요인 제외) 열 단위로 작동합니다.

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

데이터 프레임의 모든 값을 NA로 대체하는 방법을 고민하는 중에 저와 같은 사람이 여기에 도착한다면 다음과 같습니다.

df[,] <- NA

또 다른 옵션은 다음과 같습니다.replace와 함께 모두 0.NA용사를 mutate_all다음과 같이:

library(dplyr)
df <- data.frame(v1 = c(1,0,4,2),
                 v2 = c(3,1,0,0))
df
#>   v1 v2
#> 1  1  3
#> 2  0  1
#> 3  4  0
#> 4  2  0
mutate_all(df, ~replace(., .==0, NA))
#>   v1 v2
#> 1  1  3
#> 2 NA  1
#> 3  4 NA
#> 4  2 NA

reprex 패키지(v2.0.1)에 의해 2022-07-10에 생성되었습니다.

언급URL : https://stackoverflow.com/questions/11036989/replace-all-0-values-to-na

반응형