R에서 NA를 0으로 바꾸기

Gustavo du Mortier 2023년1월30일
  1. 더 큰 R 데이터 프레임에서 NA를 0으로 대체
  2. R 데이터 프레임의 하위 집합에서 NA를 0으로 바꾸기
R에서 NA를 0으로 바꾸기

R의 데이터 프레임에서NA를 0으로 바꾸는 간단한 방법이 있습니다.my_data라는 데이터 프레임이 있다고 가정합니다. 해당 데이터 프레임에서 모든 NA값을 0으로 바꾸려면이 문을 실행할 수 있습니다.

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

예를 들어my_data에 아래 내용이있는 경우.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4  NA   4  <NA>   7  10
5   1   2   ZC1  NA   2

my_data[is.na(my_data)] <- 0을 실행하면 데이터 프레임의 내용이 이것으로 변경됩니다.

   C1  C2    C3  C4  C5
1   4   3     0   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4     0   7  10
5   1   2   ZC1   0   2

더 큰 R 데이터 프레임에서 NA를 0으로 대체

이전 솔루션은 상대적으로 작은 데이터 프레임이있을 때 잘 작동하는 Base R 하위 집합 재 할당을 사용합니다. 그러나 더 큰 데이터 세트의 경우 최신 버전의dplyr 패키지에 구현 된 새로운 하이브리드 평가 방식과 같은 더 빠른 대안이 필요할 수 있습니다.

dplyr 패키지에서 채택한 새로운 접근 방식은 전체 표현식을 인식하고이를 평가하기 위해 C++ 코드를 사용합니다. 이러한 방식으로 빅 데이터 프레임을 처리 할 때 최대 30 % 더 빠른 변환을 달성 할 수 있습니다.

dplyr 패키지를 사용하여NA 값을 0으로 바꾸려면 아래 예와 같이_all 범위 동사가있는mutate 함수와purrr 형식의replace 함수를 사용할 수 있습니다.

my_data <- mutate_all(my_data, ~replace(., is.na(.), 0))

purrr표기법을 사용하면 각 데이터 프레임 요소에 replace기능을 적용 할 수 있습니다.

R 데이터 프레임의 하위 집합에서 NA를 0으로 바꾸기

mutate 함수의_all 범위 동사 대신_at 범위 동사를 사용하여 특정 열로 대체 작업을 제한 할 수 있습니다. 이를 위해 대체를 적용 할 열 이름이있는 벡터를 포함 할 수 있습니다. 이전 데이터 프레임을 사용하여 C1C4열에서만 NA값을 교체해야하는 경우 다음 명령을 사용할 수 있습니다.

my_data <- mutate_at(my_data, c("C1", "C4"), ~replace(., is.na(.), 0))

이렇게하면 C1C4열의 NA 만 0으로 대체되어 아래와 같은 데이터 프레임이 생성됩니다.

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

이전 예에서 C3과 같은 영숫자 열에 0 값을 포함하지 않도록 숫자 열에서만 NA를 0으로 바꾸고 싶을 수 있습니다. 이 경우 대체를 적용 할 열을 지정하는 대신is.numeric 조건과 함께mutate_if 함수를 사용하여 R에게 숫자 열에서만NA를 0으로 바꾸도록 지시 할 수 있습니다. 다음 예에서는dplyr 패키지 설치 및 데이터 프레임 채우기에서 교체 수행 및 결과 표시에 이르기까지이를 시도 할 수있는 전체 코드를 찾을 수 있습니다.

install.packages("dplyr")
library(dplyr)
C1 <- c(4, 9, 1, NA, 1)
C2 <- c(3, 8, 1, 4, 2)
C3 <- c(NA, 'ABC', 'XYZ', NA, 'ZC1')
C4 <- c(3, 5, 3, 7, NA)
C5 <- c(7, 10, NA, 10, 2)
my_data <- data.frame(C1, C2, C3, C4, C5)
my_data <- mutate_if(my_data, is.numeric, ~replace(., is.na(.), 0))
my_data

출력:

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   0
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

mutate()함수 및 그 변형에 대한 자세한 정보는 R 문서에서 확인할 수 있습니다.

관련 문장 - R Data Frame