SW/R

R : 매트릭스(matrix), 데이터 프레임(data frame) 사용법 및 예제

얇은생각 2019. 2. 4. 12:30
반응형

데이터프레임에 대해서 여러가지 정보를 얻어오는 다양한 함수들이 있습니다. 우선 어떤 데이터 프레임이 있습니다. 파일에서 읽어왔습니다. 굉장히 데이터가 많이 들어있습니다.



사용법1


그러면 이것이 행이 몇 행이 있고 열이 몇 열이 있을까요? 그래서 dim으로 2차원 matrix의 행의 수와 열의 수를 알아내는 함수입니다. 그렇게 실행하면 아래 보이는 것처럼 150, 5 이렇게 나오는데 이게 한 이렇게 나오는데 이것이 행과 열의 수가 됩니다.


그다음에 nrow는 number of row의 약자입니다. 그래서 행의 개수를 가져오게 됩니다.


그다음에 ncol는 number of column 그래서 column의 수를 가져옵니다. 그 다음에 namesiris 그러면 이것은 column의 이름입니다. 나중에 보면 colnames라고 하는 함수도 있는데 똑같습니다. 그런데 그냥 names 그러면 column의 이름입니다.


그 다음에 head 그러면 head가 머리라는 뜻입니다. dataset이 쭉 있으면 앞쪽의 몇 개만 좀 보여주는 뜻이 되겠습니다. 그리고 tail, tail은 꼬리라는 뜻입니다. dataset이 이만큼이 있으면 아래쪽에 맨 뒤쪽에 있는 것 몇 개만 좀 보여주는 것입니다.



사용법2


이런 data fame이나 matrix의 어떤 내용을 한 눈으로 파악할 수 있게 해주는 함수가 있습니다. 그것이 str이라고 하는 함수입니다. 이 str이라는 함수는 여러 군데에 여러 목적으로 쓰이기는 하는데, dataset에 대해서 str 함수를 적용하면 이 dataset의 정보를 이것저것 잘 알려줍니다.


unique라는 함수가 있습니다. 중복된 것 빼고 중복 없는 애들만 보여주는 뜻입니다. 그래서 결국 3개의 품종만 딱 나옵니다. 이것이 이제 unique라는 함수입니다.


그다음에 table이라고 하는 함수가 있는데, 이것은 도수분포표를 만드는 것입니다. 그래서 iris의 Species, 이 column을 집어넣으면 품종별로 setosa가 50개, versicolor가 50개, virginica가 50개 이런 식으로 정보를 보여줍니다. 이렇게 도수분포표를 만드는 것이 table이라는 명령어가 되겠습니다.



사용법3


이번에는 행과 열 단위로 어떤 작업을 좀 해보겠습니다. 지금 우리가 살펴볼 명령은 colSums, col은 column이라는 뜻입니다. colSums 그러면 column별 합계, 그다음에 colMeans 그러면 column별 평균입니다. 그다음에 rowSums 그러면 행별 Sums, rowMeans 그러면 행별 평균 그다음에 아래 rowSums을 보면 이번에는 행별로 합계를 내는 것이니까 이 방향으로 합계를 내는 것입니다. 그러면 첫 번째 줄 합계 내고 두 번째 줄 합계 내고 쭉 이렇게. 그러면 합계가 모두 몇 개 나올까요? 150개의 합계가 나옵니다.


그래서 일일이 첫 번째 column의 평균이 무엇일까요? 그러면 그것을 잘라서 Sums하면 됩니다. 그런데 이것이 그냥 모든 column을 다 하려면 colSums이라고 하는 함수에 집어넣으면 됩니다. 그런데 여기에 Input으로 iris하고서 –5 했습니다. -5는 무슨 뜻일까요? 다섯 번째 column은 제외하고입니다. 왜 제외했을까? 얘는 그룹 정보가 들어있는 문자열이자, 이것을 갖다가 합계를 내거나 평균을 내거나 하는 것이 의미가 없습니다. 그래서 그것은 뺍니다. 그리고 앞의 4개에 대해서만 적용한 것입니다.



행과 열 변환(transpose)하기

사용법4


이번에는 2차원의 데이터가 주어져 있을 때 행과 열을 바꾸는, 행은 열 쪽으로 보내고 열은 행 쪽으로 보내는, 뒤집는 연산을 한번 생각해보겠습니다. 일단 이것을 위해서 1에서 20까지를 4행 5열에 그런 matrix에 만듭니다. 그러면 여기에 보는 것처럼 matrix가 1, 2, 3, 4, 5, 6, 7, 8 해서 20까지가 들어있습니다. 이것에 대해서 행과 열을 뒤집으려면 t라고 하는 아주 간단한 함수를 씁니다. 그래서 이런 식의 변환을 행과 열을 변환하는 transpose라고 하는 변환인데, 수학 시간에도 배운 바가 있습니다. 그래서 여기에 transpose로 하면 어떻게 되는지가 오른쪽에 예가 나와 있습니다. 첫 번째에는 1행 2열인데 이것을 transpose하면 어떻게 될까요? 2행 1열이 되고, 두 번째는 2행 2열인데 당연히 바꿔도 2행 2열인데, 숫자의 배열이 바뀝니다. column이 열로 이렇게 가고 있는 그런 것들을 알 수 있습니다. 그래서 여러분이 어떻게 바뀌는지 감이 오셨나요? 그래서 이렇게 행과 열을 바꾸고 싶으면 t를 하면 됩니다.



subset() 함수 : 조건에 맞는 행(row) 추출

사용법5


이번에는 subset이라고 하는 함수를 살펴볼 텐데, 이것은 진짜 많이 쓰이는 함수입니다. 첫 번째 코드를 보니까 IR.1에 뭘 뽑아서 저장하고 있는데, subset을 했습니다. subset 그랬으니까 뭔가를 행을 뽑는 것인데, 대상이 무엇이냐 하면 iris입니다. 첫 번째가 대상 matrix나 data fame이 있습니다. 그다음에 두 번째가 어떤 것을 뽑아올까에 대한 조건입니다. Species하고서 지금 등호 2개입니다. 이 얘기는 Species는 이것이 매개변수 이름이 아니라는 것입니다. Species하고서 등호 2개, 이것하고 setosa 이것까지가 하나의 조건입니다. 조건절 자체를 매개변수로 넣은 것이 이렇다는 얘기입니다. 그래서 이것을 주의해야 하는데, 결국 이 명령의 의미는 무엇이냐 하면 iris dataset에서 품종 정보가 품종이 setosa라고 되어있는 그런 행들이 있습니다. 그런 행들만 쫙 모아서 뽑아서 IR.1에 저장시키는 명령이 됩니다. 그래서 IR.1 해보면 setosa만 쫙 잘려서 나온 것을 알 수 있습니다. 두 번째 명령을 보면 마찬가지로 iris에서 뽑는데, 이번에는 조건이 좀 복잡합니다.


Sepal.Length가 5보다 크고, and 기호입니다. 그리고, 그다음에 Sepal.Width가 4보다 큰, 이 2가지 조건을 다 만족하는 그런 행들만 쫙 뽑아서 IR.2에 저장시키는 것입니다. 그래서 subset은 대상 matrix나 data fame, 그다음에 그 행을 뽑기 위한 조건, 이렇게 구성이 되어있습니다. 그래서 여러분이 이 조건만 잘 들 줄 알면 어떤 것이든지 이렇게 뽑아서 새로운 data fame을 만들 수가 있습니다.



명령문이 길 경우

사용법5


어떤 코드를 작성하다 보면 함수 하나가 굉장히 긴 경우가 나옵니다. 이럴 때 어떻게 한 줄에 못 쓰면 여러 줄에 써야 합니다. 이때 줄을 나눠야 하는데, 어떻게 나누는 것이 좋나, 이런 것에 대한 하나의 팁입니다. 나눌 때 예를 들면 지금 subset, 두 번째 명령 같은 경우 보면 Sepal.Length가 5보다 크고 그다음에 Sepal.Width가 4보다 크고 이렇게 되어있습니다. 이러면 and에 이어서 조건이 연결된 것이잖아요. 그럴 때 만약에 and에서 자르면 우리가 쉽게 and 다음에 뭐가 있겠네, 이렇게 예상이 됩니다.



matrix 간 사칙 연산

사용법6



vector를 우리가 만들면 vector, vector 사이에 더하기, 빼기, 곱하기, 나누기가 가능했습니다. matrix를 만들면 마찬가지로 더하기, 빼기, 곱하기가 matrix 간에 가능합니다. 대신 행과 열이 같아야 겠죠?



matrix vs data frame

사용법7


우리가 matrix도 살펴보았고, data fame도 보았고. 그래서 matrix하고 data fame을 이 시점에서 좀 비교를 해볼 텐데, 일단 matrix하고 data fame은 외관상 비슷합니다. 둘 다 2차원으로 되어있고, 이것이 보다 보면 이것이 도대체 matrix일까, data fame일까 헷갈리는 경우가 있습니다. 그럴 때 일단 확인을 하는 여러 가지 방법이 있는데, is.matrix 혹은 is.data.fame 이런 함수에 넣어 보면 yes, no 이렇게 나옵니다. 그다음에 class라는 함수도 있습니다. class 그래서 어떤 자료 구조를 집어넣으면, 어떤 데이터를 집어넣으면 이것이 뭔지 보여줍니다. 그래서 class(iris) 그러면 data fame이 나옵니다. class하고 state.x77 그러면 이것은 matrix라고 알려줍니다. 그래서 이런 식으로 해서 어떤 데이터를 얻었는데, 2차원인 것은 알겠는데 data fame인지 matrix인지 이런 것을 알고 싶으면 class나 이 아래에 있는 이런 명령어를 쓰면 됩니다.



사용법8


data fame을 matrix로 바꿔야 할 필요가 있을 때도 있습니다. 물론 그렇게 하려면 어떻게 될까요? data fame 안에 있는 각 column들이 다 타입이 같을 때의 얘기지요. 그럴 때는 그것을 갖다 data frame 형식으로 되어있는데 matrix라고 바꿀 수가 있는데, 우선은 그 연습을 위해서 iris.m이라고 하는 새로운 data fame을 만듭니다. data fame이었는데 matrix 형태가 되어서 iris.m에 저장이 된다는 얘기입니다. 그래서 이렇게 head하고 class 이렇게 확인해보면 matrix로 저장이 된 것을 알 수가 있습니다.



사용법9


이번에는 거꾸로 matrix로 되어있는 것을 data fame으로 바꾸는 것을 한번 해보겠습니다. state.x77이 앞에서 matrix라고 확인을 했습니다. 그것을 갖다 data fame으로 바꾸는 방법은 그냥 matrix를 data.fame이라고 하는 함수에 집어넣으면 됩니다. 그래서 st라고 하는 데에 저장을 하고, 마찬가지로 class 이렇게 해서 자료 구조를 확인해보면 data fame으로 바뀐 것을 알 수가 있습니다.



R 함수의 입력 형식 확인

사용법10


지금 이제 이렇게 보다 보면 어떤 함수는 Input을 줄 때 이런 matrix 또는 data frame 둘 중에 하나의 어떤 특정한 포맷을 요구하는 그런 함수들이 있습니다. 그래서 분명히 데이터가 2차원 데이터가 있는데 이것을 집어넣었더니 자꾸 에러가 납니다. 그 함수가 Input으로 요구하는 포맷이 아닌 것입니다. 그래서 이것이 이 함수가 data frame을 요구하는지 matrix를 요구하는지, 혹은 둘 다 넣어도 상관이 없는지 이런 것들을 때때로 확인을 해야 하는데, 그때는 어떻게 해야 하느냐면 함수에 대해서 help 기능을 써서 매뉴얼을 봐야 합니다. 그 매뉴얼을 보면 첫 번째 함수 같은 경우에는 여기 Arguments에 보면 좀 빨간 밑줄 그은 것 보이시나요? matrix 또는 data fame 이렇게 되어있습니다. 그러면 이 함수는 2차원 배열을 Input으로 받는데 matrix로 되어있든, data fame으로 되어있든 상관이 없다는 얘기입니다. 그리고 두 번째 아래쪽에 보면 데이터를 입력을 받는데 이번에는 어떻게 되어있나요? vector이거나 matrix 이렇게 되어있습니다. 요구하는 Input 데이터의 포맷의 요구사항이 있으니 유의하시기 바랍니다.

반응형