본문 바로가기
R 주제/R 기초 및 통계 강의

[R강의] 172. 결측치를 평균값으로 대체하기 (ifelse)

by 만다린망고 2023. 8. 29.
반응형

벡터나 데이터프레임에 있는 결측치를 평균값으로 대체하는 방법을 알아봅시다. ifelse 문이 사용되므로 ifelse문을 먼저 배워보겠습니다. 

 

1. ifelse 문

ifelse 문은 아래와 같이 사용합니다. 

ifelse(테스트,참일경우반환,거짓일경우반환)

예를 들면 아래와 같습니다. 

> ifelse(1==2,1,0)
[1] 0


1==2는 거짓이므로 0을 반환합니다. 테스트 자리에 벡터를 넣으면 각 원소별로 테스트가 수행되어 값이 반환됩니다. 

> v=c(1,2,3,4,5)
> ifelse(v==1,1,0)
[1] 1 0 0 0 0


v의 각 원소를 1과 비교하여 같으면 1, 다르면 0이 출력됩니다. 

 

2. 벡터의 결측치를 평균값으로 대체

아래와 같은 벡터가 있다고 합시다. 

v1=c(1,2,NA,4,NA)


벡터의 각 원소가 NA인지 확인한 뒤, NA이면 평균값을 반환하고 NA가 아니면 그대로 두면 됩니다. ifelse 문은 아래와 같이 사용합니다. 

> ifelse(is.na(v1),mean(v1,na.rm=TRUE),v1)
[1] 1.000000 2.000000 2.333333 4.000000 2.333333


이 결과를 v1에 넣어줘도 되고 다른 변수를 정의해도 됩니다. 

 

3. 데이터프레임의 결측치를 평균값으로 대체 

아래와 같은 데이터프레임이 있다고 합시다. 

v1=c(1,2,NA,4,NA)
v2=c(10,20,NA,NA,50)
df=data.frame(v1,v2)


데이터프레임의 각 열을 기준으로 결측치를 평균으로 대체하는 방법은 아래와 같습니다. 

df[,1]=ifelse(is.na(df[,1]),mean(df[,1],na.rm=TRUE),df[,1])
df[,2]=ifelse(is.na(df[,2]),mean(df[,2],na.rm=TRUE),df[,2])


결과는 아래와 같습니다. 

> df
        v1       v2
1 1.000000 10.00000
2 2.000000 20.00000
3 2.333333 26.66667
4 4.000000 26.66667
5 2.333333 50.00000


만약 열이 많다면 코드가 길어지므로 아래와 같이 for문을 작성하면 됩니다. 

for (i in 1:dim(df)[2]) {
df[,i]=ifelse(is.na(df[,i]),mean(df[,i],na.rm=TRUE),df[,i])
}



반응형

댓글