2024. 9. 26. 16:20ㆍR분석
행렬
동일한 데이터 유형을 저장하는2차원의 데이터 구조이며, 행(row)와 열(colums)으로 구성되어있다. 또한 행렬의 벡터의 집합이라고도 할 수 있다.
행렬 생성
#행렬(matrix)
#행렬의 생성
#행렬명 <- matrix(데이터 값, now=(행의수), col=(열의수))
matrix1 <- matrix(1:6, nrow=2, ncol=3);
print(matrix1) #2행3열의 행렬생성
#[,1]에서 콤마표시는 열과 행의 표시
matrix2 <- matrix(1:9, nrow=3, ncol=2)
#데이터의 개수와 행열의 개수가 맞지 않는다면 에러!
print(matrix2)
matrix2 <- matrix(1:9, nrow=4, ncol=4)
#공간이 남아도 에러난다. 항상 데이터의 값과 공간은 동일하게
matrix2 <- matrix(1:9, nrow=3, ncol=3)
print(matrix2)
#행렬생성시 행과 열 생락하면 1열의 행렬로 생성
matrix11 <- matrix(10:15,,)
print(matrix11)
행렬을 생성할때는 행렬을 뜻하는 matrix함수를 사용하여 만든다. 행렬명 <- matrix(값, 행, 열)의 형태로 입력하며, 이때 행과 열을 생략하면 입력한 데이터는 열의 행렬로 생성된다. 행렬을 만들때는 데이터의값과 행열의 개수가 무조건 동일해야하며, 공간이 남거나 모자르면 에러가 나며 행렬이 생성되지 않는다.
행렬의 속성확인함수
행렬 속성확인함수 종류
- dim() : 행렬의 구조를 반환
- nrow() : 행의 수 반환
- ncol() : 열의 수 반환
#행렬의 속성확인 함수
#dim
print(dim(matrix2)) #3행 3열
print(dim(matrix1)) #2행 3열
#nrow
print(nrow(matrix1)) #2행
print(nrow(matrix2)) #3행
#ncol
print(ncol(matrix1)) #3열
print(ncol(matrix2)) #3열
행렬의 요소접근(인덱싱, 슬라이싱)
#행렬의 요소접근
#행렬명[행의인덱스번호, 열의인덱스번호]
print(matrix1)
matrix1[2,3] #2행 3열(맨 마지막)
print(matrix2)
print(matrix2[2,1])
print(matrix2[3,2])
print(matrix2[1,1])
#행만 출력하는 경우
print(matrix2[,2]) #,아무것도 적지 않으면 열은 전부가져오겠다라는 뜻
#행없이 2열 전체
print(matrix2[1,]) #1행만 가져오겠다는 뜻
#이렇게 출력되는 값들은 전부 벡터(행렬은 벡터의 집합)
print(matrix2)
print(matrix2[1,2:3]) #1행에서 2~3열
print(matrix2[1:2,1:2]) #2차원의 형태로 가져올경우 행렬의 형태
print(matrix2[-2,]) #2행제외 전부
print(matrix2[,-2]) #2열제외 전부
print(matrix2[1:2,-c(1,3)]) #슬라이싱말고 개별값으로 여러개 빼고싶다면
#벡터형태로 묶어서 출력
벡터에서 인덱싱을 통해 요소에 접근하는 방법은 벡터명[인덱스번호]였다. 행렬도 마찬가지로 행렬명[행번호, 열번호]의 형태로 요소에 접근해야한다. 단일값을 출력하고싶을때는 행번호1개 열번호1개를 적으면 그 인덱스에 해당하는 값이 출력된다.
만약 행만 추출하거나 열만 추출하고싶을때는 콤마를적어주고, 이때 출력되는 값은 벡터의 형태로 출력된다. 행번호, 열번호자체에서 슬라이싱을 하여 값을 추추할 수도 있는데 이경우는 2차원으로 출력되기때문에 행렬의 형태로 출력된다.
행렬의 요소 수정
#행렬의 요소 수정
#벡터의 경우 : 벡터명[인덱스 번호] <- 값
#행렬의 경우 : 행렬명[행번호, 열번호] <- 값
print(matrix2)
matrix2[2,3] <- 10 #기존 8이 10으로 수정
print(matrix2)
matrix2[2,] <- c(3,3,3)
print(matrix2)
matrix2[2,] <- rep(6,times=3)
print(matrix2) #rep를 사용해서 값 수정 가능
matrix2[,1] <- seq(21,25,2)
print(matrix2) #seq사용가능 #1열의 값이 21,25,2로 변경
요소를 수정하는 방법역시 벡터와 동일하다. 먼저 인덱싱이나 슬라이싱을 이용하여 원하는 값에 먼저 접근한후, 단일값이라면 단일값을 입력하거나 다중값이라면 c()함수로 묶어전달해야하며 이때 벡터생성옵션인 rep과 seq를 사용할 수 있다.
행렬의 조작함수
행렬의 조작함수 종류
- t() : 행렬의 전치를 반환 (행과열 교체)
- rbind(행렬명, 벡터) : 벡터를 행렬의 행으로 추가
- cbind(행렬명, 벡터) : 벡터를 행렬의 열로 추가
- apply(행렬명, 1 or 2, 함수) : 행렬의 행 또는 열에 함수를 적용한다.(1=행, 2=열)
#행렬의 조작함수
#1)전치함수 : t()
t_matrix <- t(matrix1) #전치함수는 원본변경이 안되기때문에
#전치함된 행렬을 다시 변수에 넣어 사용
print(dim(matrix1)) #2행 3열
print(dim(t_matrix)) #3행 2열
print(t_matrix[3,2])
#2)rbind(행렬명, 벡터) : 행추가
print(matrix1)
mat1 <- rbind(matrix1,c(10,20,30))
print(mat1) #밑에 10,20,30의 값이 출력됨
mat1 <- rbind(matrix1,rep(3,times=3))
mat1 <- rbind(matrix1,seq(3,10,3))
print(mat1)
#3)cbind(헹렬명, 벡터) : 열추가
mat2 <- cbind(matrix1,c(10,20))
print(mat2)
#4)apply(행렬, 1or2, 함수명)
print(matrix1)
print(apply(matrix1, 1,sum))# 행별 합계계산
print(apply(matrix1,2,max))#열별 최대수 출력
print(apply(matrix1,1,median)) #행별 중간값 출력
*전치함수의 경우 원본변경이 안되고 출력하는 그 당시에만 전치한 값을 보여주기때문에, 전치된 행렬을 사용하고싶다면 다른 행렬에 넣어서 사용하거나 같은 이름으로 재할당을 해주어야한다.
행렬의 특수함수
행렬의 특수함수 종류
- rowSums() : 행별 합계반환
- colSums() : 열별 합계반환
- rowMeans() : 행별 평균반환
- colMenas() : 열별 평균반환
print(matrix1)
print(rowSums(matrix1)) #행별 합계
print(colSums(matrix1)) #열별 합계
print(rowMeans(matrix1)) #행별 평균
print(colMeans(matrix1)) #열별 평균
행렬의 연산
#행렬의 연산
mat1 <- matrix(c(rep(10,times=2),rep(20,times=2)),nrow=2,ncol=2)
print(mat1)
print(mat1+10) #행렬 요소마다 +10
print(mat1-10) #행렬 요소마다 -10
벡터와 마찬가지로 행렬+10을 하게되면 행열요소 자체에 10이라는 숫자가 개별적으로 더해지는 연산이가능하다.
같은크기의 행렬 연산
#같은 크기의 행렬 연산
mat2 <- matrix(seq(50,80,10),nrow=2,ncol=2)
print(mat2)
print(dim(mat1)) #2행 2열
print(dim(mat2)) #2행 2열
print(mat1+mat2) #같은 위치에 있는 요소끼리 계산
print(mat1-mat2)
print(mat1*mat2)
같은 크기의 행렬을 계산할때는 벡터와 마찬가지로 같은 위치에있는 요소끼리 계산된다.
크기가다른 행렬의 계산(브로드 캐스팅)
#크기가 다른 행렬의 계산
mat1 <- matrix(c(1,2,3),nrow=1,ncol=3)
mat2 <- matrix(1:6,nrow=2,ncol=3)
print(dim(mat1)) #1행 3열
print(dim(mat2)) #2행 3열
print(mat1+mat2) #에러발생 크기가 동일하지 않음
#벡터+행렬(브로드 캐스팅)
print(c(1,2)+mat1) #브로드캐스팅도 벡터와 행렬이배수관계에 있어야함
print(length(mat2)) #mat2 개수6개
print(c(1,2)+mat2) #2와 6은 배수관계이므로 재사용법칙에 의해 계산가능
#컬럼방향으로 브로드캐스팅된것
크기가 다른 행렬은 크기가 동일하지 않기때문에 에러가 발생하며 계산되지 않는다. 하지만 이때 벡터+행렬의 게산은 가능한데, 조건이 벡터와 행렬이 배수관계에 있어야한다는 점이다. 벡터와 행렬이 배수관계에 있지않다면 역시 에러가 발생하여 계산되지 않는다.
행렬 활용 실습코드
실습코드1
#<실습1>
#1) 1~20으로 구성된 4행 5열의 행렬 생성
test_mat <- matrix(1:20,nrow=4,ncol=5)
print(test_mat)
print(dim(test_mat))
#2) 10으로만 구성된 2행 4열의 행렬 생성
test_mat2 <- matrix(rep(10,times=8), nrow=2, ncol=4)
print(test_mat2)
print(dim(test_mat2))
#3)2까지 만든 행렬의 2행 4열의 값을 35로 수정후 출력
test_mat2[2,4] #10
test_mat2[2,4] <- 35
print(test_mat2)
#4) 위에서 만든 행렬에서 1행의 2열~4열까지 값을 2~4로 수정후 출력
test_mat2[1,2:4]
test_mat2[1,2:4] <- c(2:4)
print(test_mat2)
#5) 31~34로 구성된 새로운 행 추가
rbind(test_mat2,c(31:34))
print(test_mat2)
#6) 41~43로 구성된 새로운 열 추가
cbind(test_mat2,c(41:43))
print(test_mat2)
#7) 행마다의 합 출력
print(rowSums(test_mat2))
print(apply(test_mat2,1,sum))
#8) 열마다의 평균 출력
print(colMeans(test_mat2))
print(apply(test_mat2,2,mean))
#9) 행마다의 최대값, 열마다의 최소값 출력
print(apply(test_mat2,1,max))
print(apply(test_mat2,2,min))
(나머지는 간단하니 설명패스..!) 8번과 9번의 경우는 행렬의 특수함수와 apply함수를 모두 사용가능한 문제이다. 하지만 apply를 사용하면 sum과 mean이외의 함수도 사용이 가능하다.
실습코드2
#<실습2>
#1) 11~30 중 홀수로만 구성된 5행 2열의 행렬 생성
test_mat3 <- matrix(seq(11,30,2),nrow=5,ncol=2)
print(dim(test_mat3))
#2) 위에서 만든 행렬의 행과 열을 전치한 새로운 행렬 생성후 출력
t_test_mat3 <- t(test_mat3)
print(t_test_mat3)
#3)2까지 만든 행렬의 2행 4열의 값을 35로 수정후 출력
t_test_mat3[2,4]
t_test_mat3[2,4] <- 35
print(t_test_mat3)
#4) 위에서 만든 행렬에서 1행의 2열~4열까지 값을 2~4로 수정후 출력
t_test_mat3[1,2:4]
t_test_mat3[1,2:4] <- c(2:4)
print(t_test_mat3)
#5) 31~35로 구성된 새로운 행 추가
t_test_mat3 <- rbind(t_test_mat3,c(31:35))
print(t_test_mat3)
#6) 41~43로 구성된 새로운 열 추가
t_test_mat3 <- cbind(t_test_mat3,c(41:43))
print(t_test_mat3)
#7) 행마다의 합 출력
print(rowSums(t_test_mat3))
print(apply(t_test_mat3,1,sum))
#8) 열마다의 평균 출력
print(colMeans(t_test_mat3))
print(apply(t_test_mat3,2,mean))
#9) 행마다의 최대값, 열마다의 최소값 출력
print(apply(t_test_mat3,1,max))
print(apply(t_test_mat3,1,min))
학습일기
오..이제 행렬까지 왔다. 행렬자체가 벡터의 집합이다보니 함수나 인덱싱방법을 제외하고는 사용법이 거의 비슷해서 크게 어려운점은 없었다. 데이터가 2차원으로 넘어온만큼, 함수나, 데이터를 추출하는게 확실히 1차원보다는 약간 헷갈리는 부분들이 있지만 함수활용하는연습을 더 해서 원하는 데이터값을 쉽고 빠르게 추출할 수있도록 해야할것 같다. 최대한 다양한 방법으로 데이터를 추출해보는 연습을 많이 할것..!
'R분석' 카테고리의 다른 글
R복습_데이터구조 리스트(생성, 인덱스, 슬라이싱, 함수, 결합) (0) | 2024.09.27 |
---|---|
R복습_데이터구조 배열(생성, 인덱스, 슬라이싱, 함수, 연산) (0) | 2024.09.27 |
R복습_데이터구조 벡터(생성, 인덱싱,슬라이싱,이름지정,연산) (0) | 2024.09.25 |
R_기초 다루기(연산자, 연산자활용 실습) (5) | 2024.09.25 |
R_기초 다루기(변수,자료형,특수데이터,형변환, 출력함수) (4) | 2024.09.25 |