R - 통계 언어
R 결측치 찾기, 결측치 제거, 결측치 생성, 결측치 대체하기
티멀
2022. 6. 1. 14:43
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
반응형