분석을 진행하다 보면 하나의 데이터 셋에서 변수를 생성, 제거, 변환하는 작업 못지않게 새로운 데이터 셋을 기존의 데이터 셋과 결합하는 작업 또한 빈번합니다.  이번 포스팅에서는 rbind(), cbind(), merge()함수를 활용해서 데이터 프레임 결합하는 방법에 대해서 알아보도록 하겠습니다.

 

예전에 포스팅 했던 R 행렬 함수(☞ 바로가기) 에서 rbind(), cbind()를 다루었던 적이 있는데요, 데이터 프레임도 행렬에서의 데이터 결합과 동일하며, 복습하는 차원에서 한번 더 짚어 보고, key값 기준으로 결합하는 merge()에 대해서 추가로 알아보도록 하겠습니다.

 

 

 R 데이터 프레임 결합 : rbind(), cbind(), merge()

 

[ rbind(), cbind(), merge() 함수 비교 ]

 

 

 

(1) 행 결합 (위 + 아래) : rbind(A, B)

 

먼저 실습에 사용할 데이터 프레임 두개(cust_mart_1, cust_mart_2)를 생성해 보겠습니다.

 

> ## 데이터 프레임 생성
> cust_id <- c("c01","c02","c03","c04")
> last_name <- c("Kim", "Lee", "Choi", "Park")
> cust_mart_1 <- data.frame(cust_id, last_name)
> 
> cust_mart_1
  cust_id last_name
1     c01       Kim
2     c02       Lee
3     c03      Choi
4     c04      Park
> 
> 
> cust_mart_2 <- data.frame(cust_id = c("c05", "c06", "c07"), 
+                           last_name = c("Bae", "Kim", "Lim"))
> 
> cust_mart_2
  cust_id last_name
1     c05       Bae
2     c06       Kim
3     c07       Lim

 

 

다음으로 두개의 데이터 프레임(cust_mart_1, cust_mart_2)을 세로 행 결합 (위 + 아래) 해보도록 하겠습니다.

 

> ## (1) 행 결합 (위 + 아래) rbind(A, B) > cust_mart_12 <- rbind(cust_mart_1, cust_mart_2) > > cust_mart_12 cust_id last_name 1 c01 Kim 2 c02 Lee 3 c03 Choi 4 c04 Park 5 c05 Bae 6 c06 Kim 7 c07 Lim

 

 

rbind()는 row bind 의 약자입니다. rbind()를 무작정 외우려고 하지 마시고, row bind의 약자라는걸 이해하시면 됩니다. 

위의 행 결합 rbind()를 하기 위해서는 결합하려는 두개의 데이터 셋의 열의 갯수와 속성, 이름이 같아야만 합니다. 

 

아래의 예시 처럼 만약 칼럼의 갯수가 서로 다르다면 (cust_mart_12는 열이 2개, cust_mart_3은 열이 3개) 열의 갯수가 맞지 않는다고 에러 메시지가 뜹니다.

 

> cust_mart_3 <- data.frame(cust_id = c("c08", "c09"), 
+                           last_name = c("Lee", "Park"), 
+                           gender = c("F", "M"))
> cust_mart_3
  cust_id last_name gender
1     c08       Lee      F
2     c09      Park      M
> rbind(cust_mart_12, cust_mart_3)
Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

 

 

아래의 예처럼 칼럼의 이름(cust_mart_12 는 cust_id, last_name 인 반면, cust_mart_4는 cust_id, first_name)이 서로 다르다면 역시 에러가 납니다.

 

> cust_mart_4 <- data.frame(cust_id = c("c10", "c11"), 
+                           first_name = c("Kildong", "Yongpal"))
> cust_mart_4
  cust_id first_name
1     c10    Kildong
2     c11    Yongpal
> rbind(cust_mart_12, cust_mart_4)
Error in match.names(clabs, names(xi)) : 
  names do not match previous names 

 

 

(2) 열 결합 (왼쪽 + 오른쪽) : cbind(A, B)

 

> ## (2) 열 결합 cbind(A, B)
> 
> cust_mart_5 <- data.frame(age = c(20, 25, 19, 40, 32, 39, 28), 
+                           income = c(2500, 2700, 0, 7000, 3400, 3600, 2900))
> 
> cust_mart_12
  cust_id last_name
1     c01       Kim
2     c02       Lee
3     c03      Choi
4     c04      Park
5     c05       Bae
6     c06       Kim
7     c07       Lim
> cust_mart_5
  age income
1  20   2500
2  25   2700
3  19      0
4  40   7000
5  32   3400
6  39   3600
7  28   2900
> 
> cust_mart_125 <- cbind(cust_mart_12, cust_mart_5)
> cust_mart_125
  cust_id last_name age income
1     c01       Kim  20   2500
2     c02       Lee  25   2700
3     c03      Choi  19      0
4     c04      Park  40   7000
5     c05       Bae  32   3400
6     c06       Kim  39   3600
7     c07       Lim  28   2900

 

cbind()는 column bind의 약자입니다.   cbind()도 열 결합을 하려고 하면 서로 결합하려는 두 데이터셋의 관측치가 행이 서로 동일 대상이어야만 하고, 행의 갯수가 서로 같아야만 합니다

 

만약, cbind()를 하는데 있어 행의 갯수가 서로 다르다면 아래의 예처럼 에러 메시지가 뜹니다.

 

> cust_mart_6 <- data.frame(age = c(34, 50), + income = c(3600, 5100)) > cust_mart_6 age income 1 34 3600 2 50 5100 > cbind(cust_mart_125, cust_mart_6) Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 7, 2

 

 

 

(3) 동일 key 값 기준 결합 : merge(A, B, by='key)

 

두개의 데이터셋을 열 결합할 때 동일 key 값을 기준으로 결합을 해야 할 때가 있습니다.  cbind()의 경우 각 행의 관찰치가 서로 동일 대상일 때 그리고 갯수가 같을 때 가능하다고 했는데요, 만약 각 행의 관찰치가 서로 동일한 것도 있고 그렇지 않은 것도 섞여 있다면 그때는 cbind()를 사용하면 안됩니다.  이때는 동일 key 값을 기준으로 결합을 해주는 merge(A, B, by='key')를 사용해야만 합니다.

 

아래의 cbind()의 잘못된 예를 하나 보시겠습니다.

 

> cust_mart_12
  cust_id last_name
1     c01       Kim
2     c02       Lee
3     c03      Choi
4     c04      Park
5     c05       Bae
6     c06       Kim
7     c07       Lim
> 
> cust_mart_7 <- data.frame(cust_id = c("c03", "c04", "c05", "c06", "c07", "c08", "c09"), 
+                           buy_cnt = c(3, 1, 0, 7, 3, 4, 1))
> 
> cust_mart_7
  cust_id buy_cnt
1     c03       3
2     c04       1
3     c05       0
4     c06       7
5     c07       3
6     c08       4
7     c09       1
> cust_mart_127_cbind <- cbind(cust_mart_12, cust_mart_7)
> cust_mart_127_cbind
  cust_id last_name cust_id buy_cnt
1     c01       Kim     c03       3
2     c02       Lee     c04       1
3     c03      Choi     c05       0
4     c04      Park     c06       7
5     c05       Bae     c07       3
6     c06       Kim     c08       4
7     c07       Lim     c09       1
 
 

 

cust_mart_12 와 cust_mart_7 의 두 개의 데이터 프레임의 관측치가 서로 같은 것(cust_id 가 c03 ~ c07)도 있는 반면, 서로 다른 것(cust_id 가 c01~c02, c08~c09)도 있습니다.  이런 데이터 셋을 cbind()로 결합시켜버리면 엉뚱한 데이터 셋이 생성되어 버립니다. Oh no~!!!!!

 

이런 경우에는 동일한 key 값을 기준으로 결합을 시켜주는 merge(A, B, by='key')가 답입니다.

SQL에 익숙한 분들은 잘 아시겠지만, merge에는 기준을 어느쪽에 두고 어디까지 포함하느냐에 따라 Inner Join, Outer Join, Left Outer Join, Right Outer Join 등의 4가지 종류가 있습니다.  이를 도식화하면 아래와 같습니다.

 

[ merge() 함수의 join 종류 ]

 

 

위에 제시한 4가지 join 유형별로 merge() 함수 사용예를 들어보겠습니다.

 

(3-1) merge() : Inner Join 

 

> # (3-1) merge() : Inner Join > cust_mart_127_innerjoin <- merge(x = cust_mart_12, + y = cust_mart_7, + by = 'cust_id') > > cust_mart_127_innerjoin cust_id last_name buy_cnt 1 c03 Choi 3 2 c04 Park 1 3 c05 Bae 0 4 c06 Kim 7 5 c07 Lim 3

 

 

(3-2) merge() - Outer Join

 

> # (3-2) merge() : Outer Join > cust_mart_127_outerjoin <- merge(x = cust_mart_12, + y = cust_mart_7, + by = 'cust_id', + all = TRUE) > > cust_mart_127_outerjoin cust_id last_name buy_cnt 1 c01 Kim NA 2 c02 Lee NA 3 c03 Choi 3 4 c04 Park 1 5 c05 Bae 0 6 c06 Kim 7 7 c07 Lim 3 8 c08 <NA> 4 9 c09 <NA> 1 

 

 

(3-3) merge() : Left Outer Join

 

> # (3-3) merge() : Left Outer Join
> cust_mart_127_leftouter <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id', 
+                                  all.x = TRUE)
> 
> cust_mart_127_leftouter
  cust_id last_name buy_cnt
1     c01       Kim      NA
2     c02       Lee      NA
3     c03      Choi       3
4     c04      Park       1
5     c05       Bae       0
6     c06       Kim       7
7     c07       Lim       3 

 

 

(3-4) merge() : Right Outer Join

 

> # (3-4) merge : Right Outer Join
> cust_mart_127_rightouter <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id', 
+                                  all.y = TRUE)
> 
> cust_mart_127_rightouter
  cust_id last_name buy_cnt
1     c03      Choi       3
2     c04      Park       1
3     c05       Bae       0
4     c06       Kim       7
5     c07       Lim       3
6     c08      <NA>       4
7     c09      <NA>       1 

 

 

이상 merge() 함수의 4가지 유형의 join 에 대하여 알아보았습니다.  마지막으로, merge() 함수는 2개의 데이터 셋의 결합만 가능하며, 3개 이상의 데이터 셋에 대해서 key 값 기준 merge() 결합을 하려고 하면 에러가 나는 점 유의하시기 바랍니다.

 

> merge(cust_mart_12, cust_mart_5, cust_mart_7, by = 'cust_id')
Error in fix.by(by.x, x) : 
  'by' must specify one or more columns as numbers, names or logical

 

따라서 데이터 프레임 2개씩을 key 값 기준으로 순차적으로 merge() 해나가야 합니다.

 

이상으로 데이터 프레임의 결합에 대해서 마치도록 하겠습니다. 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. AshtrayK 2016.09.02 14:14 신고  댓글주소  수정/삭제  댓글쓰기

    이번은 질문도 없네요 ㅎㅎㅎ
    감사합니다!

  2. 2016.09.22 16:08  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 제발 2016.09.28 20:16  댓글주소  수정/삭제  댓글쓰기

    혹시 개인적으로 궁금한거 여쭤봐도될까요 ㅠㅠ

  4. 산낙지 2016.10.21 10:09  댓글주소  수정/삭제  댓글쓰기

    merge에 대해 이해가 너무 잘 되네요!
    좋은 설명 너무 감사합니다 ^^
    정말 구글에서는 영어로만 나와서 아무래도 찾기 막막했는데
    r friend님 블로그에 정리가 너무 잘 되어 있어서 항상 도움 받네요 ^^

  5. 바람 2017.05.31 15:23  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 merge와 join에 대하여 이해를 잘 했는데 혹시 데이터id 가 중복이 됐는데 다른 변수들 값이 다른 경우에 병합은 merge로 못하나요??

    • R Friend R_Friend 2017.05.31 15:27 신고  댓글주소  수정/삭제

      그런 경우라면 merge 시 뻥튀기가 될겁니다. id 외 추가로 key 값으로 쓸 수 있는게 있으면 paste로 id와 다른 변수를 합쳐서 새로운 key 변수 만든후에 merge하면 되구요.

  6. 2017.06.03 15:35  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  7. 너무 좋아요! 2018.08.27 18:03  댓글주소  수정/삭제  댓글쓰기

    잘 보고 있어요 너무 감사합니다. ㅎ

  8. 2018.12.02 16:10  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2018.12.02 17:00 신고  댓글주소  수정/삭제

      분석 목적이 무엇인가, 분석기법이 무엇인가에 따라 자료 구조가 달라집니다. 분석 목적과 기법에 맞는 예제 자료 형태와 코드를 미리 살펴보시는게 좋겠습니다.

      melt, cast 함수를 사용하면 자료 구조를 원하는 형태로 바꾸실 수 있습니다.

선형대수, 통계분석, 데이터마이닝, 최적화 등을 수행할 때 행렬을 많이 사용합니다. 분석에 필요한 변수가 많아질 수록 변수들의 계수를 행렬로 해서 수식을 표현하고 컴퓨터에게 연산을 시키는 것이 편리하기 때문입니다.

 

선형대수(Linear Algebra)를 배우지 않은 분들께서는 행렬연산이 좀 낯설텐데요, 행렬연산에 대해 좀더 깊이 들어가는 부분은 일단 이번 포스팅에서는 생략하겠으며, 앞으로 특정 분석 주제에 대한 포스팅에서 기회가 되면 다루도록 하겠습니다.

 

대신, 이번 포스팅에서는 행렬 연산을 위한 R의 함수 중에서 특히 행렬, 데이터 프레임에서 데이터 전처리 하는데 있어 활용도가 높은 함수들 위주로 몇 가지를 살펴보겠습니다.  데이터 분석 쪽으로 진로를 잡으려고 생각하는 분이라면 선형대수는 꼭 배워두시면 기초를 다잡을 수 있을 거라서 추천드립니다.

 

 

[ m*n 행렬 (m by n matrix) ]

 

 

 

 

이번에 살표볼 R 행렬 연산 함수로 +, -, *, /, ^, %*%, cbind(), rbind(), colMeans(), rowMeans(), colSums(), rowSums(), t() 등을 순서대로 예를 들어 설명하겠습니다.

 

(참고로, R에서 배열, 행렬도 모양이 조금 다른 벡터입니다.  따라서 벡터의 명령어가 배열, 행렬에도 적용된다고 보면 되겠습니다.)

 

 

 R 행렬 연산 : +, -, *, /, ^, %*%, cbind(), rbind(),

                   colMeans(), rowMeans(), colSums(), rowSums(), t()

 

(1) 행렬 내 각 숫자끼리의 연산 : +, -, *, /, ^

 

> ## 행렬 X와 행렬 Y 생성

> X <- matrix(1:4, nrow=2, ncol=2, byrow=FALSE, dimnames = NULL)
> X
     [,1] [,2]
[1,]    1    3
[2,]    2    4
>
> Y <- matrix(5:8, nrow=2, ncol=2, byrow=TRUE, dimnames = NULL)
> Y
     [,1] [,2]
[1,]    5    6
[2,]    7    8

 

예전 데이터 구조에 대한 포스팅에서 행렬 생성에 대해 다루었었는데요, matrix()함수와 각 옵션에 대해서 한번 더 복습해 보겠습니다.  ncol 은 칼럼 갯수, nrow 는 행의 갯수, byrow=FALSE 는 X 행렬 예에서 처럼 위에서 아래로 byrow=TRUE는 Y 행렬 예시 처럼 왼쪽에서 오른쪽으로 행렬이 생성됩니다.

 

> ## 행렬 X와 행렬 Y의 각 숫자끼리의 연산: +, -, *, /, ^ > X + Y [,1] [,2] [1,] 6 9 [2,] 9 12 > > X - Y [,1] [,2] [1,] -4 -3 [2,] -5 -4 > > X * Y [,1] [,2] [1,] 5 18 [2,] 14 32 > > X / Y [,1] [,2] [1,] 0.2000000 0.5 [2,] 0.2857143 0.5 > > X ^ Y [,1] [,2] [1,] 1 729 [2,] 128 65536

 

숫자형으로 구성된 두 행렬에 대해 +, -, *, /, ^ 연산을 하게 되면 같은 위치에 있는 숫자끼리 연산을 하게 됩니다.  (1)번 X * Y 곱셉의 경우 아래 (2)번 예시의 X %*% Y 와 어떻게 다른지 유심히 살펴보시기 바랍니다.  선형대수를 공부하신 분이라면 (1)번 X * Y 곱셈 결과를 보고 '이거 뭐지?' 하고 의아해 하실 것 같은데요, (1) 번 형식의 X * Y 는 각 구성 원소를 순서대로 그냥 곱한 겁니다.  선형대수에서 배웠던 행렬과 행렬의 곱셉은 아래 (2) 번 X %&% Y 형식의 명령문을 사용하게 됩니다.

 

 

(2) 행렬 X와 행렬 Y의 곱 : X %*% Y

 

> X %*% Y
     [,1] [,2]
[1,]   26   30
[2,]   38   44

 

통계, 머신러닝, 최적화 등에서 사용하는 곱셉은 아래 (2)번 X %*% Y 곱셉인 경우가 많을 텐데요, 분석 목적에 맞게 선택해서 사용하시기 바랍니다.

 

 

(3) 행렬 세로 결합 cbind(), 행렬 가로 결합 rbind()

 

> ## 행렬 세로 결합 cbind() : column bind
>
cbind(X, Y) [,1] [,2] [,3] [,4] [1,] 1 3 5 6 [2,] 2 4 7 8 >
> ## 행렬 가로 겹합 rbind() : row bind
>
rbind(X, Y) [,1] [,2] [1,] 1 3 [2,] 2 4 [3,] 5 6 [4,] 7 8

 

두 행렬을 cbind(), rbind()가 행끼리 결합하는 건지, 열끼리 결합하는 건지 헷갈릴 수 도 있는데요, cbind()는 column bind, rbind()는 row bind 로 해서 기억하시면 이해하기 쉽겠지요?

 

 

(4) 행렬 X의 각 열의 평균값으로 구성된 벡터 colMeans(X), 행렬 Y의 각 행의 평균값으로 구성된 벡터 rowMeans(Y)

 

> ## colMeans(), rowMeans()
> colMeans(X)
[1] 1.5 3.5
> rowMeans(X)
[1] 2 3
> 
> colMeans(Y)
[1] 6 7
> rowMeans(Y)
[1] 5.5 7.5

 

colMeans()의 경우 데이터 프레임에서 특정 변수를 '$'로 지정해놓고 mean() 함수를 실행하면 동일한 값을 구할 수 있습니다.  데이터 프레임에서는 보통 열(변수)를 기준으로 통계 분석을 실시하므로, 만약 열을 기준으로 요약 통계를 보려면 colMeans(), 혹은 아래 colSums() 함수는 알아두면 편하겠지요. 

 

참고로, 보통은 행(row) 데이터에 대해서 분석을 하려면 (6)번의 전치 t() 함수나 melt(), cast()함수로 데이터를 열(column)으로 재구성해서 colMeans(), colSums() 나 그 밖의 통계함수를 써서 분석을 합니다.

 

 

(5)  행렬 X의 각 열의 합계로 구성된 벡터 colSums(X), 행렬 Y의 각 행의 합계로 구성된 벡터 rowSums(Y)

 

> ## colSums(), rowSums()
> colSums(X)
[1] 3 7
> rowSums(X)
[1] 4 6
> 
> colSums(Y, na.rm = TRUE)
[1] 12 14
> rowSums(Y, na.rm = TRUE)
[1] 11 15

 

na.rm = TRUE 는 행렬 연산 시에 결측값이 있으면 포함하지 말고 계산하라는 뜻입니다.  예전 포스팅에서 결측값 확인/처리 (☞ 바로 가기) 에 대해서 다룬 적이 있는데요, 아래에 Cars93 데이터 프레임을 가지고 na.omit() 함수와 동일하게 행 내에 결측값이 있으면 그 행 전체를 삭제하는 방법을  rowSums() 함수와 is.na() 함수를 사용해서 수행하는 방법을 알아보겠습니다.

 

> library(MASS)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
> sum(is.na(Cars93))
[1] 13
> 
> Cars93_na.omit <- na.omit(Cars93)
> sum(is.na(Cars93_na.omit))
[1] 0
> 
> Cars93_rowSums <- Cars93[rowSums(is.na(Cars93)) == 0, ]
> sum(is.na(Cars93_rowSums))
[1] 0

 

na.omit()함수가 훨씬 수월하므로 굳이 dataset[rowSums(is.na(dataset)) == 0, ] 처럼 프로그래밍을 할 필요가 있을까 싶기는 합니다만, rowSums() 함수를 이렇게도 이용할 수 있구나 정도로 알아두시면 좋겠습니다.

 

 

(6) 행렬 X의 전치 t(X)

 

> ## 행렬의 전치 t()
> X
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> 
>
t(X) [,1] [,2] [1,] 1 2 [2,] 3 4 >
> > Y [,1] [,2] [1,] 5 6 [2,] 7 8 >
>
t(Y) [,1] [,2] [1,] 5 7 [2,] 6 8 > > Z <- matrix(1:6, nrow=2, ncol=3) > Z [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 >
>
t(Z) [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6

 

t(X)로 행렬을 전치하면 위의 예에서 보는 것처럼 행과 열이 서로 바뀌게 됩니다.  통계분석의 행과 열 기준을 바꾸고 싶거나, 그래프 그릴 때 가로와 세로를 바꾸고 싶을 때 t() 함수로 전치를 해서 쓰면 되겠지요.

 

한번더 부언하자면, 선형대수에 나오는 행렬 연산 전부를 다루지는 않았습니다만, 데이터 분석 쪽으로 계속 공부하려는 분이라면 선형대수 공부는 몸에 좋은 밑거름이 될것이니 따로 공부해보시길 권합니다.

 

 

행렬에 대해 소개한 포스팅을 아래에 링크 걸어놓습니다. 참고하세요.

 

행렬 기본 이해

특수한 형태의 행렬 (zero matrixtranspose matrixsymmetric matrixupper triangular matrixlower triangular matrixdiagonal matrixidentity matrix, I, or unit matrix, U)

가우스 소거법을 활용한 역행렬 계산 (Invertible matrix, Gauss-Jordan elimination method)

여인수를 활용한 역행렬 계산 (Invertible matrix, by using cofactor)

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 김진양 2019.01.09 21:26  댓글주소  수정/삭제  댓글쓰기

    선생님, 안녕하세요!
    공부를 하다 궁금한게 있어 여쭤봅니다!
    Cars93에서 결측치를 제거한 Cars93_na.omit에 대해 궁금한게 있는데요!
    결측치를 제거한 후 str()을 통해 관측치가 93개 → 82개로 줄어든 것을 확인했습니다.
    하지만, 이후 Cars93_na.omit 데이터를 통째로 까보니 행이 93개로 여전히 있어서요.
    관측치가 82개가 제거되었다면, 해당 행도 제거가 되어야할 것 같은데 93개가 있어서 혼동이 생기네요!
    혹시 어떻게 된 건지 알 수 있을까요?

  2. 꾸리꾸리 2019.05.08 20:43  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.

    혹시 data.frame에서
    원하는 열에만 전체적으로 값을 더하거나 뺄 수 있는 방법이 있는지 질문 드립니다.

    ex) A B C D -> A B C D
    1 2 3 4 1 3 3 5
    2 3 4 5 2 4 4 6

    데이터 프레임은 유지하대 b와 d에만 +1 및 -1을 하는 방법이 있을지 궁금합니다.

    • R Friend R_Friend 2019.05.09 18:26 신고  댓글주소  수정/삭제

      안녕하세요. 답글이 늦어서 죄송합니다.

      아래의 transform() 함수를 참고하세요.

      > A <- c(1, 2)
      > B <- c(2, 3)
      > C <- c(3, 4)
      > D <- c(4, 5)
      >
      > df <- data.frame(A, B, C, D)
      > df
      A B C D
      1 1 2 3 4
      2 2 3 4 5
      >
      > df <- transform(df,
      + B = B + 1,
      + D = D - 1)
      >
      > df
      A B C D
      1 1 3 3 3
      2 2 4 4 4

    • R Friend R_Friend 2019.05.09 19:03 신고  댓글주소  수정/삭제

      + C, + D 에서 앞에 + 부호는 제거해주세요. 콘솔창에 결과 나타날때 계속 이어진다는 의미의 + 예요.

    • 꾸리꾸리 2019.05.09 19:15  댓글주소  수정/삭제

      네 정말 감사합니다 잘 적용 되었습니다.

      실례지만 추가질문을 드리자면

      기존의 값에 +,-를 하여 나온 두 컬럼으로
      나누기, 곱하기 및 LOG값 (log10, log2)에 대해 계산을 하여 나타내려면 transform을 응용하여야 하나요?
      ( ex
      1.
      A B C D E F G,H, I 중 B and C의 값에 변화 ( +, -)를 주어 나타내고
      2. B 및 C의 값으로 위에서 질문드린 계산을 하여 E(곱), F(log10),G(log2) 에 나타내고 합니다.
      3. A , H and I는 기존 값을 유지한 상태

    • R Friend R_Friend 2019.05.09 19:38 신고  댓글주소  수정/삭제

      (1) transform() 을 사용하시려면 2-step 으로 나누어서 B, C 에 (+, -) 변화를 준 DataFrame을 먼저 만들고 -> 이후 이어서 곱, 로그10, 로그2 를 취해서 DataFrame을 만들어주어야 합니다.

      (2) 대안으로, dplyr 을 이용하시면 한번에 처리하실 수 있습니다. https://rfriend.tistory.com/235 포스팅을 참고하세요.