본문 바로가기

Data analysis story

[R 프로그래밍]- 데이터프레임(Dataframe)의 모든 것 [초보자들이 이해하기 쉬움!!]

안녕하세요! 여러분! 오늘은 드디어 R언어 데이터 타입의 마지막 시간이네요!

오늘은 R애서 가장 중요한 데이터 타입이라고 할 수 있는 ‘데이터프레임(Data Frame)’에 대해서 배워보는 시간을 가져보겠습니다!

이번글은 긴 글이지만 데이터프레임에 대해서 정확히 알고 싶다면 천천히 시간을 가지고 읽어보는 것을 추천드려요!!

 

이때까지 우리는 벡터, 리스트, 매트릭스, 어레이, 팩터 등등 다양한 데이터 형태를 배워왔습니다.

그런데 현실 세계에서 가장 많이 사용하는 데이터 형태는 표(table) 형태인데, 지금까지 표(테이블)형태의 데이터를 쉽게 다룰 수 있는 자료형을 배운 적 있었나요?

 

실제 세계의 테이블 형태의 조건은

다양한 자료형을 넣을 수 있어야 한다는 점과

또 당연히 표 형태니까 2차원이어야 한다는 점이겠죠?

 

매트릭스는 이차원의 테이블 형태였지만 숫자면 숫자, 문자면 문자 이렇게 한 가지 자료형만 들어갈 수 있었습니다.

그리고 리스트는 다양한 자료형을 넣을 수 있었지만 표 형태가 아니었죠.

 

, 매트릭스와 리스트 둘 다 태이블 형태의 데이터를 표현하기엔 부족합니다!

 

그렇다면 실제 세계의 표는 과연 어떤 자료형으로 나타낼 수 있는 걸까요?

 

바로 그것이 이번에 배울 데이터프레임!이라는 것이죠!

 

다시 정리하면 데이터 프레임은 2차원으로 이루어진 table 형태의 자료입니다.

예시를 함께 보시죠!

위의 표는 2차원의 형태이며홍길동이라는 문자도 들어갈 수 있고 80이라는 숫자도 들어갈 수 있네요!

 

데이터프레임을 적용할 수 있는 표의 조건

 

이 표를 좀 자세히 관찰해보죠!

데이터프레임 자료형을 사용할 수 있는 실제 세계의 표에는 조건이 있거든요!!

위의 표에서 첫번째 행과 나머지 행은 다른 구조로 되어있지 않나요?

데이터를 수집할 때 수집할 대상이 되는 것들을 변수들이라고 하고 그것이 테이블에서 제일 첫번째 행에 해당합니다.

위 표에서는 성명”, “국어”, “영어가 되겠죠!

 

뭘 수집하고자 하느냐, , 수집하자 하는 것의 속성(feature, attribute, property 이렇게 여러가지로 불려요!)인 것이죠!

이렇게 데이터프레임으로 표현하고자 하는 테이블에는 첫번째 행에만 변수가 있어야 합니다.

그러니까 위의 테이블 예에서는

데이터를 수집할 때 성명과, 국어 점수, 영어 점수, 이 세 가지의 속성을 수집하고 싶은 것이죠!

 

그럼 첫번째 행 말고 그 다음의 행들은 무엇일까요?

앞서 설정한 변수에 대한 값들을 수집하는 것이 되는 것이죠!

관측 값 (observation, record)이라고 합니다.

이것들이 첫번째 행을 제외한 나머지 행들에 해당하는 것이죠!

위의 예시를 보면

(성명: 홍길동, 국어:90, 영어:94), (성명: 김길동, 국어:97, 영어:100), (성명:박길동, 국어: 85, 영어: 97)

이 세 가지의 행들이 관측 값이 되는 것이죠!

 

, 쉽게 생각해보면 설문지를 돌릴 때 질문 문항 하나가 변수들이 되는 것이고 대답들이 값이 되는 것입니다.

 

앞서 제가 매트릭스는 실제 세계의 표를 나타낼 수 없다고 한 이유가 무엇이었죠?

바로 매트릭스는 같은 종류의 자료형들만 포함해야 하기 때문이었죠!

따라서 데이터 프레임은 다양한 종류의 자료형을 포함할 수 있습니다.

 

여러 종류의 자료형을 포함한다면 변수마다 다른 자료형을 지정할 수 있다는 것이겠죠??

이렇게 보니 무슨 말인지 이해가 더 잘 가죠?? 당연히 한 열은 같은 데이터 타입으로 이루어져야 겠죠?

성명에 홍길동’, ‘345’, ‘박길동이렇게 들어가는 것은 이건 너무 이상하죠?

 

그런데 여기서 조건이 하나 있는데요, 데이터프레임은 모든 관측 값의 길이가 같아야 합니다.

위의 예로 보면 성명도 3개의 관측 값, 국어도 3개의 관측 값, 영어도 3개의 관측 값이어야 한다는 소리죠!!

(여기서 잠깐! 비교해보죠! 리스트는 원소의 개수도 달라도 상관없었죠??)

 

데이터 프레임을 적용할 수 있는 실제 세계의 표를 한 가지 더 볼게요!

제가 위에서 말한 조건들이 하나라도 어긋나는 게 있는지 봐주세요!

아마 없을 겁니다!

이런 표들이 데이터프레임으로 표현할 수 있다는 것입니다!

세상의 모든 표가 데이터프레임으로 표현할 수 있는 게 아니기 때문에

조건을 몇 가지 정리해봤습니다!!!

 

데이터프레임 생성하기

그러면 한 번 데이터 프레임을 생성해볼까요??

데이터 프레임을 생성하는 함수도 역시나 data.frame()입니다.

아까 예시 들에서 변수들을 각각 떼어놓고 보면

벡터들의 집합이라고 봐도 무방한데요

변수 하나하나가 벡터로 이루어져있죠?

 

그래서 생성할 때도 벡터를 여러 개 생성한 후 그것을 모아서 데이터프레임으로 만들어 볼게요!

이렇게 people이라는 변수에 데이터프레임을 하나 생성하여 할당했습니다.

 

 

데이터 프레임 변수명 바꾸기

행렬에서 행 이름과 열 이름을 바꿨던 것과 마찬가지로

데이터프레임에서도 변수명과 관측지 명들을 바꿀 수 있습니다!!

 

colnamesnames는 같은 함수로 열의 이름, 즉 변수의 이름을 바꾸는 기능을 하는데요!

 

앞서 들은 예에서 변수의 이름을 앞에만 대문자로 바꾸고 싶다고 해보죠!

그럴 때는 names함수를 사용하여 바꿔주면 됩니다.!

혹은 데이터프레임을 만들 때 =이라는 연산자를 사용해 지정할 수도 있죠!

두 가지 모두 보겠습니다!

이렇게요!!

행 이름도 rownames 함수를 이용해 바꿔주면 됩니다! (매트릭스에서 다뤘기 때문에 빨리 넘어 갈게요!

이해가 안된다면 매트릭스(행렬)편을 참고해주세요!!)

이렇게 해서 관측지의 이름들도 바꿀 수 있지만

데이터 프레임에서 우리가 관심 있는 것은 rownames함수가 아니라 names함수겠죠?

 

데이터프레임 추출

결론부터 말씀드리면 데이터프레임을 추출할 때는 리스트를 추출했던 연산자와

행렬을 추출했던 연산자 모두를 사용할 수 있습니다.

 

, 데이터프레임도 리스트 추출 연산자 ‘$’을 이용해서 값을 하나씩 가져올 수 있습니다.

또 매트릭스의 연산자 [ ]를 이용해서 추출할 수도 있죠.

 

그러니까 즉, 리스트 추출 연산자, 매트릭스 추출 연산자를 모두 사용할 수 있는 게 데이터 프레임입니다.

변수의 이름을 바꾸는 방법을 보여드린다고 방금 “Name”, “Age”, “Child”로 바꿨지만 원래 상태였다고 가정하고 데이터를 추출해볼게요

 

리스트 연산자 사용

이렇게 $ 연산자를 사용하니 변수의 이름과 그에 해당되는 값들이 출력되는 것이 보이죠?

뿐만 아니라 리스트에서 사용하던 [[]] 연산자도 적용 가능해요!

변수의 이름은 제외된 채, 변수에 해당하는 값만 나오는 것입니다!

이렇게요!

데이터프레임은 표이므로 matrix 연산자도 적용할 수 있습니다. 해보죠!

행렬을 배울 때 [ , ] 연산으로 많은 연습을 해보았으니 한 번 적용해보세요!

(잘 모른다면 [R프로그래밍-행렬] 편 포스팅을 참고해주세요!!)

 

그런데 여기서 꼭 짚고 넘어가야할 것이 있습니다.

바로 data.frame() 함수 중 stringAsFactor라는 인수에 관련한 것인데요!

앞서 $[[]]를 이용하여 데이터를 추출했었는데

리스트에서 class를 이용해서 둘의 차이를 비교했었죠? ([R프로그래밍-리스트, 어레이 포스팅 참조)

이번에도 해봅시다!

 

class(people$names)을 하면 변수명과 값이 한 번에 출력되므로 data.frame이라는 값이 나올 것이고

class(people[[name]])을 하면 값만 출력되므로 character가 나와야 하잖아요?

 

한번 해보겠습니다.

이상한 거 없으신가요?? factor를 사용한 적이 없는데 왜 people[[1]]class 함수를 씌우니 factor가 나오나요?

list였으면 character가 출력됐을텐데요!

factor로 나오는 이유는 이렇습니다.

"R에서는 표로 만만들 때 문자열을 factor로 인식합니다."

 

name에 들어 있는 값들은 원래 character인데 데이터프레임으로 만들어지면서 factor로 바뀐 것이죠.

따라서 이게 싫으면

data.frame을 만들 때 stringAsFactor 인수에 F를 넣어 문자를 factor로 바꾸지 않겠다!는 설정을 해야 합니다.

그런 후 people[[1]]class함수를 씌워보면 우리가 기대하던 대로 character가 나옵니다.

데이터프레임 확장

이제 데이터프레임을 확장해볼게요!

표를 작성했는데 추가하고 싶은 변수가 생기거나,

아니면 관측을 하나 더 해서 관측지를 하나 더 추가하고 싶을 때가 있잖아요!

그럴 때 데이터프레임 확장을 하는 법을 알 필요가 있습니다.

 

일단 변수를 하나 더 추가한다면

$를 사용해서 추가할 변수명을 지정해주고

벡터 값으로 그 변수에 해당되는 값들을 추가해주면 됩니다. 이렇게요!

 

그러면 여러분들이 직접 아까의 예시 밑에 이 코드를 작성하고 실행해보세요!

전체 데이터프레임에서 height 열이 추가되었고

그에 해당하는 값은 우리가 설정한대로 들어갔죠?

 

또는 cbind()로 확장할 수도 있습니다.

이렇게요!!


변수를 추가하는 것은 이렇게 간단하지만

행을 추가하는 것은 이것보다는 다소 복잡한데요

데이터프레임에서 하나의 row는 다른 자료형을 가지잖아요.

따라서 하나의 row가 데이터프레임이 되죠.

따라서 이름을 하나씩 매칭해주어야 합니다.

이렇게요!!

 

데이터프레임 정렬하기

데이터프레임을 숫자 순으로 혹은 알파벳 순으로 정렬할 때는 어떻게 해야 할까요?

 

먼저, 나이를 적은 순으로 정렬해보기 위해 sort함수를 사용해보도록 하겠습니다.

나이가 적은 순으로 정렬이 됐죠??

그런데 우리는 나이만 정렬하고 싶은 것이 아니라 그 옆의 namechild의 값까지 같이 정렬하고 싶은 거잖아요?

 

그럴 때는 order함수를 사용합니다.

먼저 order함수를 사용해서 행의 순서를 매겨주고

그것을 추출 연산자에 넣어주면 됩니다.

 

말로는 너무 어려우니 예를 보겠습니다.

이렇게 하면 원하는 대로 데이터프레임이 정렬되는 것을 확인할 수 있습니다!

내림차순으로 하고 싶다면 order함수에 decreasing=T라는 인수를 넣어주면 된답니다!

 

이렇게 데이터프레임을 생성하는 함수에 대해 알아보았는데요!

하지만 데이터프레임은 read.csvread.table함수를 이용해서 불러오는 경우가 대부분입니다.

수동으로 값을 입력하는 경우는 거의 없죠!

이에 대해서는 다음 포스팅 파일의 입출력에서 다루겠습니다.

 

데이터가 많은 데이터프레임을 생성하기엔 시간이 많이 들겠죠?

그래서 R에서는 여러 데이터들을 제공해줍니다.

데이터프레임에 관해서 공부하고 싶다면 이런 R에 내장된 데이터들을 불러와서 여러 함수들을 적용해보면 되겠죠!

data()를 쳐보면

이렇게 많은 내장 데이터들을 확인해볼 수 있습니다.

 

이 많은 내장 데이터 중에 mtcars를 불러와볼게요!

mtcars는 자동차 연비에 대한 데이터를 저장해 놓은 데이터 셋입니다!

 

방대한 양의 데이터가 저장되어 있으니

head()함수를 이용해 앞에서부터 6개의 데이터만 보도록 하겠습니다.

tail()함수는 마지막 6개의 데이터를 보여주는 함수입니다.

우리가 배운 데이터프레임 형태로 예쁘게 저장되어 있는 것을 볼 수 있죠?

 

그러면 이제 str함수를 사용해서 데이터 셋의 전체적인 구조를 볼게요!

데이터 프레임이며 32개의 관측지(obs)11개의 변수(variables)로 구성되어 있다고 나와있죠

앞서 데이터 프레임을 생성할 때는 여러 개의 벡터 데이터를 만들어서 조합하며 힘들게 만들었지만 이렇게 내장되어 있는 데이터 셋을 사용하면 편하게 데이터프레임을 공부해볼 수 있어요!

이렇게 데이터 셋을 불러와서 공부할 수 있는 데이터프레임에 관한 함수들을 표로 소개해드릴게요!

앞서 배운 mtcars 데이터셋에 이 함수들을 적용해보세요!!

오늘은 이렇게 데이터프레임은 실제 세계의 어떤 표를 나타낼 수 있는 데이터 타입인지,

데이터프레임 추출, 확장, 변수 이름 바꾸기 등등에 대해 공부해보았습니다.

또한 R에서 제공하는 데이터 셋들과 그것을 활용해서 데이터프레임과 연관된 함수를 공부해보기도 했습니다!

 

드디어 길고 길었던 R의 데이터 타입 공부가 끝났네요!

벡터, 팩터, 매트릭스, 리스트, 어레이, 데이터 프레임까지 공부해봤는데요!

한 눈에 정리할 수 있는 그림을 마지막으로 첨부할게요!

R공부 화이팅하자구요!!^^