본문 바로가기
R

[R] 데이터프레임(DataFrame) 생성, 변수 추가, 결합 및 인덱싱

by JKyun 2017. 2. 7.

안녕하세요. 우주신 입니다.


블로그를 시작한지 아직 한달도 안 됐지만 몇몇분들이 방문해주시니 너무 신기하고 감사하네요!!


새삼 21세기 정보화 사회에 살고 있구나 깨닫고 인터넷의 위엄을 느끼기도 합니다.


공부하는 데 조금이라도 도움이 되기를 바라는 마음으로 오늘은 데이터프레임에 대해 정리해보겠습니다.


데이터프레임(DataFrame)은 R에서 가장 많이 쓰이는 데이터 구조라 정말 중요합니다!


다른 데이터구조와는 달리 데이터 유형에 국한받지 않고 2차원 형태의 데이터 구조를 생성할 수 있기 때문이죠. 






1. 데이터프레임(DataFrame) 생성



우선, xNum, xLog, xChar 변수들을 가지고 df 라는 데이터프레임을 생성했습니다. 

데이터프레임을 만들 땐, data.frame( ) 함수를 사용하면 되는 것으로 배웠죠?


str( ) 함수를 통해 데이터프레임의 구조를 확인해보면, xChar 변수는 Factor(범주형)로 입력되어 있습니다.

이를 통해 data.frame( ) 함수 사용시, 문자형은 자동으로 Factor로 인식을 하는 것을 알 수 있습니다.

이 때는 data.frame( , stringsAsFactors = FALSE)을 넣음으로써 문자형을 Factor가 아닌 Character로 입력할 수 있습니다.

stringsAsFactors = F 로 나타내기도 합니다.



2. 데이터프레임(DataFrame) 변수 추가


데이터프레임을 사용하다보면 종종 변수를 추가할 때가 많습니다.

먼저, 밑과 같이 dataframe$variable 를 통해 변수를 추가하는 방법이 있습니다.

기존 df에 Name이라는 새로운 변수를 4번째 열에 추가한 결과입니다. 간단하죠?


두번째 방법은 transform(dataframe, variable = ' ') 함수입니다. 

df에 새로운 변수 Age를 그 다음 열에 추가한 결과 입니다. 

transform( )함수가 첫번째 방법보다 깔끔하고 여러개의 변수도 한번에 생성할 수 있다는 점에서 이를 선호합니다.



3. 데이터프레임(DataFrame) 결합 


데이터프레임 결합은 앞시간에 행렬 결합에서 배웠던 rbind( ), cbind( ) 함수를 이용하면 됩니다.

df1의 아래에 df2를 결합해기 위해 rbind( )함수를 사용했습니다.

행렬(Matrix)와 마찬가지로 열의 개수가 같아야 오류가 안 뜹니다.

위 df3를 보면 깔끔하게 결합되었죠?


다음으로는 cbind( )함수를 사용하기 위해 df4 데이터프레임을 생성했습니다.

df5를 보면 오른쪽에 결합된 것을 확인할 수 있습니다.

참고로, df3와 df4의 위치를 바꿔주면 그 순서대로 결합되는 것을 확인할 수 있습니다.


마지막으로 merge( )함수를 사용해보겠습니다.

우선, df5에 df6를 cbind( )함수를 통해 추가해보았지만 행(row)의 개수가 달라 오류가 뜹니다.


merge(dataframe, dataframe, key = ' ') 함수는 데이터프레임의 변수 개수와 상관없이 key를 통해 유연하게 결합할 수 있습니다.

df5와 df6를 name 변수를 기준으로 Student라는 새로운 데이터프레임을 생성한 결과입니다.

df5의 name에 E가 없기에 이는 생략된 것을 확인할 수 있습니다.



4. 데이터프레임(DataFrame) 인덱싱


데이터프레임 Student의 변수 height를 구하는 방법에는 3가지가 있습니다.

-Student[ ,2], Student[[2]], Student$height

모두 동일한 방법이지만 개인적으로는 Student$height와 같이 명확히 변수이름을 써주는 것을 추천합니다.


-Student[ ,-1]: Student에서 1번째 행을 제외한 전체 구성요소를 가리켜라.

-Student[1:2, ]: Student에서 1번째부터 2번째 행에 있는 구성요소를 가리켜라.

-Student[Student$height > 11, ]: Student에서 Student$height가 11보다 큰 행에 있는 구성요소를 가리켜라.





끝.


다음 시간에는 데이터프레임 변수명 변경, 변수 선택 및 정렬에 대해 배워보겠습니다.


수고하셨습니다. 





댓글4

  • 리메 2017.04.25 08:59

    안녕하세요. 좋은 지식 공유해 주셔서 감사합니다. 혹시 데이터 프레임에서 추가로 제가 질문을 해도 될까 싶어서 댓글 드립니다.
    1. 먼저 컬럼 위치를 이동하는 법 아시나 해서 여쭤봅니다. 지금 찾고 있는데 잘 안나오네요. 예를 들면 df라는 데이터 프레임에 a, b, c 라는 컬럼이 있는데 출력이 a, b, c 순서가 아닌 c, a, b 순서로 바꾸고 싶습니다.
    2. 두번째는 df의 왼쪽에 보면 번호가 있는데 (1, 2, 3, 4) 이부분을 접근하는 방법이 있는지 궁금해서 여쭤봅니다.
    감사합니다.

    답글

    • JKyun 2017.04.25 10:26 신고

      안녕하세요~

      1.
      df = data.frame(a=c(1,2), b=c(2,3), c=c(3,4), d=c(4,5))

      df[,c(1, 3, 2, 4)]
      df[,c(4, 3, 2, 1)]

      인덱싱을 활용해서, col의 열 순서를 바꿨습니다.
      그대로 실행해보시면 이해가실거에요.

      2.
      왼쪽 1, 2, 3, 4 는 몇번째 행인지 알려주는 정보로 이 부분 또한 인덱싱으로 접근하면 되지 않을까요?

      df[1,]의 경우 첫번째 행의 요소들에 접근,
      df[1,3]의 경우 첫번째 행의 세번째 열의 요소에 접근.

      참고로, 행 또한 열처럼 이름을 지정하여 접근할 수 있습니다.

      위의 코드에서
      rownames(df)= c('a', 'b') 와 같이 실행해보세요~

  • 리메 2017.04.26 07:48

    답변주셔서 감사합니다.
    1번 질문은 아주 깔끔하네요. 생각 못했던 방법인데 여쭤보길 잘했다는 생각이 듭니다.
    2번 질문도 깔끔하게 정리되네요. 2번은 부연설명을 드리면 주가 정보가 있는 아래와 같은 stock.info라는 데이터가 있다고 가정할 때,

    Date Open High Low Close Volume
    1 2017-04-24 43550 43800 41350 41400 212729
    2 2017-04-21 43900 43950 43550 43750 55718
    3 2017-04-20 43650 44200 43300 43750 68882
    4 2017-04-19 44750 45400 43450 43550 236404
    5 2017-04-18 43950 45250 43950 45000 103425
    6 2017-04-17 44250 44700 43800 44100 51535

    이에 대한 수익금을 계산하기 위하여 앞 행에서 뒤 행의 주가를 차감하여 새로운 데이터 프레임 profit을 다음과 같이 만들 경우,
    profit<-stock.info[ ,2:6]
    profit<-profit[2:NROW(profit), ] - profit[1:NROW(profit)-1, ]

    이 상황에서 profit을 출력해보면 row number 가 1번이 아닌 2번부터 시작을 합니다.
    별건 아니지만 이걸 어떻게 1번부터 만들까 고민하고 있었는데, rownames 를 제가 모르고 있었던 거네요.

    좋은 답변 감사드립니다.



    답글

  • 2021.02.05 11:42

    비밀댓글입니다
    답글