R의 행렬 함수: 생성, 인쇄, 열 및 슬라이스 추가
⚡ 스마트 요약
R에서 행렬은 m개의 행과 n개의 열에 걸쳐 단일 데이터 유형을 저장하는 2차원 배열이며, `matrix()` 함수로 생성되고, `cbind()` 및 `rbind()` 함수로 확장되며, 대괄호를 통해 접근할 수 있습니다.

R의 행렬 함수
R의 행렬 함수는 m개의 행과 n개의 열을 갖는 2차원 배열입니다. 즉, R 프로그래밍의 행렬은 동일한 데이터 유형을 가진 두 개 이상의 벡터의 조합입니다.
기본적으로 행렬은 길이가 2인 dim 속성을 가진 벡터입니다. 따라서 모든 요소는 동일한 데이터 유형을 공유해야 합니다. 문자 값과 숫자 값이 결합되는 순간, 전체 행렬은 문자형으로 강제 변환됩니다. R은 값을 단일 열에 저장하고 dim 속성을 사용하여 각 행의 끝을 결정합니다. 데이터 형식 전체 객체에 한 번에 적용됩니다.
참고 : `matrix()` 함수 자체는 항상 정확히 2차원의 행렬을 반환합니다. R에서 3차원 이상의 구조를 만들려면 `array()` 함수에 `dim` 벡터를 지정하거나 `dim` 값을 직접 할당해야 합니다. 아래 그림은 모든 행렬이 따르는 행과 열의 구조를 보여줍니다.
R에서 행렬을 만드는 방법
우리는 이 함수를 사용하여 행렬을 만들 수 있습니다. 행렬()기본 R 함수 시그니처는 다섯 개의 인수를 받으며, 그중 가장 자주 사용되는 세 가지는 다음과 같습니다.
matrix(data, nrow, ncol, byrow = FALSE)
인수 :
- 데이터: R이 행렬의 행과 열로 배열할 요소들의 집합입니다.
- 지금행의 개수.
- 엔콜열의 개수.
- byrow: 논리 플래그입니다. 기본값인 byrow = FALSE로 설정하면 행렬이 위에서 아래로 열 단위로 채워집니다. byrow = TRUE로 설정하면 왼쪽에서 오른쪽으로 행 단위로 채워집니다.
- 딤네임: 행 이름과 열 이름을 제공하는 길이가 2인 선택적 목록입니다.
첫 번째 예제를 살펴보기 전에 R 기본 참조 문서에서 알아두면 유용한 두 가지 사항이 있습니다. nrow와 ncol 중 하나만 주어지면 R은 데이터 길이를 기반으로 나머지 하나를 추론합니다. 또한 데이터에 요청한 형태를 채울 만큼 충분한 요소가 없는 경우, 해당 값은 버려지는 대신 재활용됩니다.
1부터 10까지의 숫자 시퀀스를 사용하여 5×2 행렬 두 개를 만들어 보겠습니다. 하나는 byrow가 TRUE인 행렬이고, 다른 하나는 byrow가 FALSE인 행렬입니다. 이를 통해 차이점을 살펴보겠습니다.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = TRUE matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5) matrix_a
출력:
byrow = TRUE가 사용되었기 때문에 콘솔은 첫 번째 행에 1과 2를, 두 번째 행에 3과 4를, 이런 식으로 계속 채웁니다.
dim() 함수를 사용하여 matrix_a의 차원을 출력합니다.
이제 Dim()을 사용하여 R에서 행렬의 차원을 인쇄해 보겠습니다. Dim()을 사용하여 R에서 행렬을 인쇄하는 구문은 다음과 같습니다.
# Print dimension of the matrix with dim()
dim(matrix_a)
출력:
## [1] 5 2
dim() 함수는 먼저 행 개수를, 그 다음 열 개수를 반환하여 5×2 형태를 확인시켜 줍니다.
byrow = FALSE인 경우 열 방향으로 행렬을 채웁니다.
같은 10개의 숫자와 같은 행이라도 채우는 방향이 바뀌면 다른 배열이 만들어집니다.ping byrow는 기본적으로 두 번째 열이 시작되기 전에 첫 번째 열의 값을 아래로 보냅니다.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = FALSE matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5) matrix_b
출력:
dim() 함수를 사용하여 matrix_b의 차원을 출력합니다.
다시 한번, Dim()을 사용하여 행렬의 차원을 인쇄합니다. 다음은 R 인쇄 행렬 차원의 구문입니다.
# Print dimension of the matrix with dim()
dim(matrix_b)
출력:
## [1] 5 2
5×2에서 모양은 변하지 않습니다. 왜냐하면 byrow는 채우기 순서만 변경하고 크기는 변경하지 않기 때문입니다.
주의 사항: `matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2)` 명령어를 사용하면 R이 제공된 10개의 값으로부터 nrow = 5를 추론하므로 위와 동일한 효과를 얻을 수 있습니다.
`ncol` 함수를 사용하여 4×3 행렬을 생성할 수도 있습니다. R은 3개의 열을 생성하고 각 열을 위에서 아래로 채웁니다. 예제를 확인해 보세요.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
출력:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
열 헤더 [,1]부터 [,3]까지와 행 레이블 [1,]부터 [4,]까지는 R의 기본 자리 표시자입니다. 이 튜토리얼 뒷부분에서 보여주는 것처럼 실제 차원 이름이 제공되면 이러한 자리 표시자는 사라집니다.
예:
dim(matrix_c)
출력:
## [1] 4 3
cbind()를 사용하여 행렬에 열 추가
R에서 행렬에 열을 추가하려면 `cbind()` 명령어를 사용하면 됩니다. `cbind()`는 열 결합을 의미하며, 지정된 만큼의 행렬이나 열을 연결할 수 있습니다. 예를 들어, 이전 예제에서는 5×2 행렬을 생성했습니다. 이제 세 번째 열을 연결하여 5×3 행렬이 되었는지 확인해 보겠습니다.
예:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
출력:
## [1] 5 3
예:
matrix_a1
산출
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
예:
또한 한 번에 여러 열을 결합할 수도 있습니다. 다음 블록은 13부터 24까지의 숫자를 저장하는 4×3 행렬인 matrix_a2를 생성하여, 4×3 행렬인 matrix_c와 결합함으로써 1부터 24까지의 숫자를 포함하는 4×6 행렬을 생성합니다.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
출력:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
예:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
출력:
## [1] 4 6
주의사항R에서 cbind() 함수가 제대로 작동하려면 두 행렬의 행 수가 같아야 합니다. 행 수가 다르면 R은 행 수가 더 적은 입력을 재사용하거나 오류를 발생시키므로, 먼저 두 객체의 dim() 함수를 확인하여 행 수를 확인하는 것이 안전합니다.
cbind() 함수는 열을 연결하는 반면, rbind() 함수는 행을 추가합니다. matrix_c 행렬에 행 하나를 추가하여 크기가 5×3인지 확인해 보겠습니다.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3) # Create a vector of 3 columns add_row <- c(1:3) # Append to the matrix matrix_c <- rbind(matrix_c, add_row) # Check the dimension dim(matrix_c)
출력:
## [1] 5 3
add_row와 같이 이름이 지정된 벡터를 바인딩하면 새 행에도 해당 이름이 지정된다는 점에 유의하십시오. 이는 아래에서 다룰 레이블이 지정된 행렬을 향한 첫 번째 단계입니다.
행렬 슬라이스
행렬에서 하나 또는 여러 요소를 선택할 수 있습니다. R 프로그래밍 대괄호 [ ]를 사용하여 행 선택자를 지정하고, 대괄호 안에는 쉼표로 구분하여 행 선택자를 먼저 쓰고 열 선택자를 두 번째로 씁니다. 바로 이 부분에서 슬라이싱이 사용됩니다.
예 :
- Matrix_c[1,2]는 첫 번째 행과 두 번째 열의 요소를 선택합니다.
- matrix_c[1:3,2:3]은 1, 2, 3행과 2, 3열에 데이터가 있는 R 슬라이스 행렬을 생성합니다.
- Matrix_c[,1]은 첫 번째 열의 모든 요소를 선택합니다.
- Matrix_c[1,]은 첫 번째 행의 모든 요소를 선택합니다.
쉼표 한쪽을 비워두면 해당 쪽의 모든 값이 선택됩니다. 초보자들이 흔히 혼동하는 점은, 단일 행이나 열을 선택할 경우 R이 빈 칸을 제외하고 일반 벡터를 반환한다는 것입니다. `matrix_c[1, , drop = FALSE]`처럼 `drop = FALSE`를 추가하면 결과가 행렬로 유지됩니다.
위 코드에 대해 얻은 결과는 다음과 같습니다.
R에서 행렬의 행과 열 이름을 지정하는 방법
[,1] 및 [3,]과 같은 기본 레이블은 행렬이 실제 의미를 갖게 되면 출력을 읽기 어렵게 만듭니다. dimnames 인수와 rownames() 및 colnames() 대체 함수는 텍스트 레이블을 추가하여 cbind(), t() 및 모든 슬라이싱 작업을 통해 행렬과 함께 전달되도록 합니다.
# Name the rows and columns while the matrix is built sales <- matrix(1:6, nrow = 2, ncol = 3, dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3'))) # Or attach the names afterwards rownames(sales) <- c('north', 'south') colnames(sales) <- c('q1', 'q2', 'q3') # Read the names back as a list of two character vectors dimnames(sales) # Names make label based slicing possible sales['north', 'q2']
| 함수 | 읽기 | 설정 |
|---|---|---|
| 디미네임(m) | 두 차원 모두 두 개의 벡터 목록으로 구성됩니다. | dimnames(m) <- list(rows, cols) |
| 행 이름(m) | 행 레이블 | rownames(m) <- 행 |
| 열 이름(m) | 열 레이블 | colnames(m) <- cols |
| 디미(m) | 행과 열을 두 개의 정수로 표현합니다. | dim(m) <- c(nrow, ncol) |
일단 레이블이 존재하면 sales['north', 'q2']는 sales[1, 2']보다 훨씬 명확하며 행 순서가 바뀌어도 유지됩니다. dimnames 구성요소를 NULL로 설정하면 해당 레이블 집합이 다시 제거되고, as.data.frame()으로 변환된 행렬은 행과 열 이름을 그대로 유지합니다. 데이터 프레임.
매트릭스 OperaR에서의 연산: 산술, 전치 및 곱셈
행렬 연산은 단일 유형 규칙이 빛을 발하는 부분입니다. 기본 R은 추가 패키지 없이 모든 연산을 지원하지만, 두 연산자를 혼동하기 쉽습니다. `*`는 요소 간 곱셈을 수행하는 반면, `%*%`는 진정한 행렬 곱셈을 수행하며 왼쪽 피연산자의 열이 오른쪽 피연산자의 행과 일치해야 합니다.
m1 <- matrix(1:4, nrow = 2) m2 <- matrix(5:8, nrow = 2) m1 + m2 # element by element addition m1 * m2 # element by element product, NOT matrix multiplication m1 %*% m2 # true matrix multiplication t(m1) # transpose: rows become columns solve(m1) # inverse, for a square matrix that is not singular rowSums(m1) # one total per row colMeans(m1) # one mean per column apply(m1, 1, max) # any function, applied row by row
- t(m)행렬을 전치합니다. 따라서 요소 [i, j]는 [j, i]가 됩니다. 차원 이름은 그대로 유지됩니다.
- solve(m): 정사각 비특이 행렬의 역행렬을 반환하고 solve(a, b)는 선형 시스템을 풉니다.
- 행 합계 / 열 합계 / 행 평균 / 열 평균: sum 또는 mean을 사용하는 apply() 함수와 동일하지만 훨씬 빠릅니다.
- apply(m, MARGIN, FUN)MARGIN = 1은 어떤 함수를 제공하든 행을 순회하고 MARGIN = 2는 열을 순회합니다.
- 진단, 탐지, 교차 생산: 대각선, 행렬식 및 t(x) %*% y의 더 빠른 형식.
이러한 연산은 벡터화되어 있기 때문에 루프 내부에 있는 것이 아니라 루프를 대체합니다. 수천 개의 셀에 대해 중첩된 for 루프가 필요했던 요약 작업이 단일 colMeans() 호출로 대체되므로 데이터 규모가 커지면 그 효율성이 크게 향상됩니다.
R에서 행렬, 데이터프레임, 배열의 차이점
행렬, 데이터 프레임, 배열은 콘솔에서 모두 직사각형 모양으로 보이지만, 각각 다른 질문에 대한 답을 제공합니다. 아래 표는 이들을 나란히 보여줍니다.
| 부동산 | 매트릭스 | 데이터 프레임 | 배열 |
|---|---|---|---|
| 크기 | 정확히 2 | 정확히 2 | 임의의 숫자 |
| 컬럼 유형 | 전체 객체에 대해 하나의 유형 | 열마다 다른 유형 | 전체 객체에 대해 하나의 유형 |
| 내장 | 행렬() | 데이터프레임() | 정렬() |
| 일반적인 사용 | 수치 계산 및 선형 대수 | 혼합 관측 데이터 | 연도별 개수와 같은 누적 표 |
| 행 레이블 | 선택적 dimnames | 행 이름은 항상 표시됩니다. | 선택적 dimnames |
# A matrix holds one type only, so mixing coerces everything to character mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2) class(mixed[1, 1]) # Convert between the structures as.data.frame(matrix_c) as.matrix(mtcars) # A matrix is the two dimensional case of an array is.matrix(matrix_c) inherits(matrix_c, 'array')
모든 칸이 같은 종류의 숫자이고 계산이 산술 연산일 때는 행렬을 활용하세요. 데이터 프레임 열에 서로 다른 데이터 유형이 포함될 때, 예를 들어 문자 이름과 숫자 가격이 함께 있는 경우 인자손을 뻗어 보세요 명부 각 부분의 길이가 서로 다를 때, 그리고 시간이나 지역과 같은 세 번째 인덱스가 실제로 존재하는 배열의 경우, as.matrix()와 as.data.frame()을 사용하면 양방향 변환 비용이 저렴하므로 구조가 작업에 맞춰지는 것이 바람직합니다.




