R 결측치 찾기, 결측치 제거, 결측치 생성, 결측치 대체하기

728x90

결측치 찾기

데이터프레임내의 결측치는 NA로 배정된다.

데이터프레임을 만들 때 결측치를 넣으려면 NA를 입력하고 쌍따옴표를 생략한다.

df <- data.frame(gender = c(1, 2, 3, NA, 5),
                 score = c(5, 4, NA, 2, 1)
                 )

 

결측치를 찾으려면 table() 함수 내에 is.na()로 데이터프레임을 매개변수로 넣어 입력한다.

table(is.na(df))


#결과물
FALSE  TRUE 
    8     2

 

각각의 행열의 결측치 위치를 확인하려면 is.na(df)로 입력한다.

is.na(df)


#결과물
     gender score
[1,]  FALSE FALSE
[2,]  FALSE FALSE
[3,]  FALSE  TRUE
[4,]   TRUE FALSE
[5,]  FALSE FALSE

 

각 행의 결측치도 $표시를 활용해 개별 접근이 가능하다

table(is.na(df$gender))

FALSE  TRUE 
    4     1

 

결측치 제거하기

제거 시 dplyr 라이브러리에 있는 내장함수 filter를 사용한다.

#filter를 사용하고 !를 사용하여 결측치가 아닌 열만 남기기
df %>% filter(!is.na(score))

#연산자도 사용가능
df %>% filter(!is.na(score) & !is.na(gender))

 

일일이 다 해줄수도 있지만 한번에 제거해주기 위해서는 아래의 함수 사용

#만약 결측치 행이 100개가 있다면 너무 불편하므로 na.omit이란 함수를 대신 사용
#이 함수는 각각의 행에 하나라도 결측치가 있다면 그 행을 전부 제외해주고 출력해준다
#단 데이터손실이 많기 때문에 잘 쓰지는 않음
na.omit(df)

 

알아서 결측치를 제외해주고 연산을 해주는 na.rm 옵션 사용

#알아서 결측치를 제외하고 연산을 해주는 na.rm
mean(df$score, na.rm = T)
sum(df$score, na.rm = T)

 

결측치 생성

필요할 시 일일이 결측치를 넣어줄 수도 있다. 

d <- read.csv('csv_exam.csv')
#d 데이터에 maht행 3, 8, 15열에 결측치 추가
d[c(3, 8, 15), 'math'] <- NA

 

결측치 대체

결측치 있는 행을 다 제거해버리면 데이터의 손실이 많이 나므로 최빈값 혹은 평균값으로 결측치를 대체하여 넣는다.

혹은 머신러닝을 통해 이 특정값을 추청하는 모형을 만든 후에 그 예측된 값을 대신 넣기도 한다.

#평균으로 대체하기 위한 평균값
d_mean <- mean(d$math, na.rm = T)
#ifelse를 활용한 결측치를 평균값으로 대체
d$math <- ifelse(is.na(d$math), d_mean, d$math)

 

 

728x90