본문 바로가기
Study/통계 공부 + R

R 기초: 데이타 구조, 데이타 클리닝(하위데이타 선택하기, 제거하기)

by PhD_Ming 2020. 12. 4.
300x250

데이타를 분석하기 전에 가장 먼저 해야할 것은 데이타 클리닝이다. 내가 직접 데이타를 수집했다면 좀 덜하지만 다른 패널 데이터를 사용하거나 e-prime 등 데이타 수집 프로그램으로부터 데이타를 구하거나 하면 하면 아주 복잡하게 구성되어 있는 경우도 많다. 나도 아이트래커를 사용해 데이타를 수집하다가(코로나때문에 중간에 막혔지만..), 학부생 졸업 프로젝트 도와준다고 데이타를 뽑아봤더니 너무 복잡하게 구성되어 있어서. 당황한 기억이 있다.

주로 볼 수 있는 가장 "깨끗한" 데이타셋은 다음과 같은 특징을 지닌다.

  • 변인 이름이 적힌 첫째 줄(row)
  • 두번째 줄부터는 데이타가 입력되어 있고, 한 줄에 한명의 데이타가 입력됨
  • 각각의 변인을 대표하는 칸들(column)

내가 저번에 공유한 데이타("R 시작하기: csv 및 excel 데이타 불러오기"에서 찾을 수 있음)는 위의 특징들을 모두 갖추었지만, 그래도 언제 어디서 지저분한 데이타를 작업해야할지 모르니 함께 배워보도록 하겠다. 

콜럼과 로우

row는 가로칸을 column은 세로칸을 의미한다. R에서 콜럼과 로우를 지칭하는 경우가 많아서 잘 알아두기로 한다.

 

데이타셋 구조보기, 변인 보기

데이타의 구조를 보는 가장 기본적인 방법으로는 structure 기능이 있다.

structure(data_name)

괄호안에 내가 불러올때 설정한 데이타 이름만 넣어주면 된다. 저번에 이어 child_data를 그대로 넣어 실행했더니 다음과 같이 데이타가 어떻게 생겼는지 볼 수 있다. 변인명 오른쪽에 세모를 누르면 그 다음 콜럼으로 넘어가고, 숫자를 누르면 그 다음 로우로 넘어간다. 

깔끔하게 구성되어 있는 데이타셋을 확인할 수 있다. 

한번에 어떠한 변인이 존재하는지를 보기위해서는 names기능이 있다

names(data_name)

structure와 동일하게 괄호안에 내가 불러올때 설정한 데이타 이름만 넣어주면 된다. 역시나 child_data를 넣어 실행해보면 다음과 같이 나타난다. R 에서는 코드에 변인 명을 직접 넣어 사용하는 경우가 잦아서, 변인명을 보기 위해 아주 자주 쓰는 코드이다. 외워두면 좋다(자주 r을 사용하다보면 어느새 외워져있긴 하다).

여기서 앞의 숫자는 해당 변인 명이 몇번째 콜럼에 있는지 알려준다. 즉 selfesteem4는 일곱번째 콜럼에 있고, selfesttem5는 여덟번째 콜럼에 있는 식이다. 

데이타 부분 삭제하기, 부분 선택하기 (Data Subsetting)

만약에 내가 가진 데이타가 첫째 줄과 둘째줄 모두에 변인이름이 적혀있다고 해보자. 한 줄을 삭제하고 싶을 것이다. 그 한줄은 어떻게 삭제할까? 

데이타의 일부를 삭제하거나 일부만을 가져오기 위해서 각괄호([])를 사용한다. [row, coulmn] 형식을 사용할 수 있다. 먼저 내가 가진 데이타셋 중 일부만을 가져오고 싶은 경우를 고려해보자. 다음 코드를 사용할 수 있다. dataold는 이미내가 가진 데이타의 이름을 적는 것이고 datanew는 새로 지을 데이타 이름을 적는 것이다. 즉 dataold의 row와 column과 관련한 명령을 실행한 뒤 이를 datanew라고 설정하는 것이라 할 수 있다.

datanew<-dataold[row,column]

r에서는 row나 column을 지칭할 때 숫자를 사용한다. 먼저 성별 데이타만 가져와보자. row는 변화없이 gender만 가져온다면, 일단 row 부분은 빈칸으로 둔다. gender는 두번째 콜럼에 있으니 column에 2라고 입력한다. 

child_gen <- child_data[ ,2]

실행시키면 오른쪽 데이타가 표시되는 쪽에 values 아래에 child_gen이 보일 것이다. 콜럼이 하나밖에 없기 때문에 더이상 데이타셋이 아니므로 values하에 나타나는 것이다. 

만약 여러개의 로우 혹은 콜럼을 가져오기 위해서는 어떻게할까? 

유용한 기능으로는 콜론(:)을 사용하는 것이다. 1:9는 1부터 9까지를 지칭하는 것이다. 우리가 가지고 있는 데이타셋중 peer관련 항목들만 빼고 새로운 데이타셋을 만들어 보기로 하자. 어떻게 코드를 짜야할까? 혼자서 해본 후 확인해보자.

더보기

child_new<-child_data[,1:13]

위 코드를 실행시킨 후 names 코드를 통해 확인해보면 아래처럼 peer 관련 항목들이 사라짐을 볼 수 있다.

원래 데이타(child_data)에서 self-esteem만 빼고 만들고 싶다면 어떻게 할까? R에서는 c()를 통해 여러개의 개별 항목들을 묶어줄 수 있다. 만약 c(1:3, 14:25) 라고 한다면 1부터 3, 그리고 14부터 25번째 칸을 지칭하는 것이다. c(1:3, 14:25)나 c(1, 2, 3, 14:25)이나 모두 같다. 그럼 실제로 해보자. 

child_new<-child_data[,c(1:3, 14:25)

위 코드를 실행시킨 후 names 코드를 통해 확인해보면 아래처럼 자존감 관련 항목들이 사라짐을 볼 수 있다.

지금까지 일부 데이타를 선택해서 하위 데이타셋을 만들어보는 것을 연습하였다. 그런데 일부 데이타를 삭제하면서 하위 데이타셋을 만들 수도 있지 않을까? YES!  삭제하기 위해서는 -를 이용한다. 

다시 self-esteem만 제거한 데이터셋을 만들어보자. 이때 여러개의 콜럼을 제거하는 것이므로 콜럼을 지칭할 때 괄호로 묶어주는 것을 잊지말자.

child_new<-child_data[,-(4:13)]

이를 실행한 경우에도 child_data[,c(1:3, 14:25)] 와 똑같은 결과를 볼 수 있다. 

 

지금까지 콜럼을 일부 선택하거나 일부 삭제하여 하위데이타셋을 만드는 것을 살펴보았다. 그러면 row를 일부 선택/삭제하려면 어떻게 해야할까? 콜럼일 때와 원리는 같다. 예를 들어 피험자1~10까지의 데이타에서 self-esteem만 제거한 하위 데이터셋을 만든다고 해보자. 코드는 다음과 같다.

child_new<-child_data[1:10,-(4:13)]

이를 실행시키고 row까지 살펴봐야하니 structure기능을 통해 살펴보면, self-esteem은 사라졌고 피험자는 10명까지만 존재한다.

 

예시문제1

우리가 가지고 있는 데이타셋에서 p5 피험자가 설문조사에 참여했는데, 너무 대충해서 거의 대부분의 문항을 빈칸으로 제출했다고 해보자. 그 피험자의 데이터를 삭제하는 게 낫다는 판단이 들어 그 피험자를 데이타셋에서 제거하려한다. 그때의 R코드는 어떻게 될까? 혼자서 생각해본 후 다음을 통해 확인해보자.

더보기

child_clean<-child_data[-5, ]

 

예시문제 2

olddata에서 네번째와 일곱번째 콜럼을 삭제하고싶다. 이를 newdat으로 이름 지을 때 R 코드는 어떻게 될까? 

더보기

newdat <- olddata[ , -c(4,7)]

 

반응형

댓글