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

[R강의] 164. 데이터프레임의 결측치 위치를 알려주는 함수 만들어보기

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

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

v1=c(NA,2,3,4,NA)
v2=c(10,20,NA,NA,50)

df=data.frame(v1,v2)

 

> df
  v1 v2
1 NA 10
2  2 20
3  3 NA
4  4 NA
5 NA 50


긱 원소의 결측치 여부를 확인하는 것은 is.na 로 가능합니다. 

> is.na(df)
        v1    v2
[1,]  TRUE FALSE
[2,] FALSE FALSE
[3,] FALSE  TRUE
[4,] FALSE  TRUE
[5,]  TRUE FALSE


오늘 하고 싶은 것은 결측치의 위치를 출력해주는 함수를 만드는 것입니다. 위 데이터 프레임을 예로 들면 아래와 같이 출력되는 것입니다. 

1,1
3,2
4,2
5,1

함수를 만들기 전에 먼저 데이터프레임의 NA 위치를 출력해주는 코드를 짜봅시다. 아래와 같습니다. 

#데이터프레임
v1=c(NA,2,3,4,NA)
v2=c(10,20,NA,NA,50)

df=data.frame(v1,v2)

#데이터 프레임 NA 위치 출력
res=data.frame(row=NA,col=NA)

for (i in 1:dim(df)[1]){
  for (j in 1:dim(df)[2]){
    
    if (is.na(df[i,j])){
      res=rbind(res,c(i,j))
    }
    
  }
}

res=res[-1,] #첫 행 제거, 첫행은 NA였음
rownames(res)=NULL #행 이름 초기화


for문의 i는 행이고 j는 열입니다. df[i,j] 가 NA인지 확인하고, 맞다면 res라는 데이터프레임에 i,j 를 추가합니다.

출력 결과는 아래와 같습니다. 

> res
  row col
1   1   1
2   3   2
3   4   2
4   5   1


이제 함수로 만들어봅시다. 함수 이름은 where.na.df 로 했습니다. 

 

where.na.df=function(df){

  res=data.frame(row=NA,col=NA)
  
  
  for (i in 1:dim(df)[1]){
    for (j in 1:dim(df)[2]){
      
      if (is.na(df[i,j])){
        res=rbind(res,c(i,j))
      }
      
    }
  }
  
  res=res[-1,]
  rownames(res)=NULL

  return(res)

}


함수를 사용해봅시다. 

> where.na.df(df)
  row col
1   1   1
2   3   2
3   4   2
4   5   1
반응형

댓글