R의 행렬 함수: 생성, 인쇄, 열 및 슬라이스 추가

⚡ 스마트 요약

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

  • 🧩 논리적 구조: 행렬은 차원(dim) 속성을 가진 벡터이므로 모든 셀은 하나의 데이터 형식을 공유해야 합니다.
  • 🛠️ 창조: `matrix(data, nrow, ncol, byrow)`는 시퀀스를 정렬하고, R은 누락된 차원을 추론합니다.
  • 🔄 주문 완료: byrow = FALSE는 열 단위로 데이터를 채우고, byrow = TRUE는 행 단위로 데이터를 채웁니다.
  • 성장: cbind()는 열을 추가하고 rbind()는 행을 추가합니다. 단, 공유되는 차원이 일치하는 경우에만 가능합니다.
  • 슬라이싱: m[row, column]은 행을 먼저 읽고, 빈 칸은 해당 칸의 모든 내용을 선택합니다.
  • 🏷️ 레이블 : dimnames, rownames() 및 colnames()는 [,1] 자리 표시자를 읽기 쉬운 이름으로 바꿉니다.
  • ➕➖ 산수: 별표(*)는 요소별 곱셈을 수행하는 반면, %*%는 행렬 곱셈을 수행합니다.

R에서 행렬 함수, 출력 생성, 열 추가 및 분할

R의 행렬 함수

R의 행렬 함수는 m개의 행과 n개의 열을 갖는 2차원 배열입니다. 즉, R 프로그래밍의 행렬은 동일한 데이터 유형을 가진 두 개 이상의 벡터의 조합입니다.

기본적으로 행렬은 길이가 2인 dim 속성을 가진 벡터입니다. 따라서 모든 요소는 동일한 데이터 유형을 공유해야 합니다. 문자 값과 숫자 값이 결합되는 순간, 전체 행렬은 문자형으로 강제 변환됩니다. R은 값을 단일 열에 저장하고 dim 속성을 사용하여 각 행의 끝을 결정합니다. 데이터 형식 전체 객체에 한 번에 적용됩니다.

참고 : `matrix()` 함수 자체는 항상 정확히 2차원의 행렬을 반환합니다. R에서 3차원 이상의 구조를 만들려면 `array()` 함수에 `dim` 벡터를 지정하거나 `dim` 값을 직접 할당해야 합니다. 아래 그림은 모든 행렬이 따르는 행과 열의 구조를 보여줍니다.

R에서 행렬 함수의 행과 열 레이아웃

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를, 이런 식으로 계속 채웁니다.

byrow = TRUE로 행별로 채워진 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

출력:

byrow = FALSE로 열별로 채워진 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에서 네 가지 행렬 분할 표현식의 콘솔 결과

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()을 사용하면 양방향 변환 비용이 저렴하므로 구조가 작업에 맞춰지는 것이 바람직합니다.

자주 묻는 질문

R은 값을 거부하는 대신 재활용하므로 matrix(1:3, nrow = 2, ncol = 3)는 시퀀스를 반복합니다. 길이가 셀 개수의 정확한 배수가 아닐 때만 경고가 표시되므로 이러한 조용한 재활용은 쉽게 간과될 수 있는 버그입니다.

음수 인덱스를 사용하세요. m[-2, ]는 두 번째 행을 삭제하고 m[, -3]은 세 번째 열을 삭제합니다. m[-c(1, 4), ]처럼 여러 개를 한 번에 삭제할 수도 있습니다. 결과를 다시 할당하기 전까지는 원래 객체가 변경되지 않습니다.

한 행 또는 한 열을 선택하면 기본적으로 빈 차원이 제거됩니다. m[1, , drop = FALSE]와 같이 drop = FALSE를 추가하면 한 행으로 된 행렬을 유지할 수 있습니다. 이는 결과가 두 차원을 기대하는 함수에 전달될 때 중요합니다.

`which(m == value, arr.ind = TRUE)`는 일치하는 모든 항목의 행과 열을 나타내는 두 열로 된 결과를 반환합니다. `arr.ind`가 없으면 결과는 열을 따라 순차적으로 계산된 단일 선형 인덱스로 표시되는데, 이는 원하는 결과가 아닌 경우가 많습니다.

array(data, dim = c(rows, columns, layers))를 사용하거나 dim(x)를 벡터에 직접 할당하세요. 그러면 슬라이싱은 차원당 하나의 인덱스를 사용하게 됩니다. 예를 들어 a[2, 3, 1]과 같습니다. 행렬은 배열의 2차원 형태입니다.

네. R 기본 참조 문서에 따르면 rowSums와 colMeans는 sum 또는 mean을 사용한 apply()와 동일하지만 훨씬 빠르며, 컴파일된 코드에서 반복이 이루어지기 때문에 명시적인 for 루프보다 효율적입니다.

모델 적합은 선형 대수입니다. 특징은 행렬을 이루고, 계수는 벡터를 이루며, 예측은 단일 곱셈 결과입니다. 기계 학습 따라서 해당 패키지들은 데이터 프레임이 아닌 숫자 행렬을 입력으로 요구합니다.

예. GitHub 부조종사 RStudio 2023.09.0 이상 버전에서 실행되며 열려 있는 파일의 주석에서 코드를 완성합니다. 차원 논리를 확인하려면 다음을 참조하십시오. RStudio잘못된 행 수를 입력해도 유효한 행렬이 생성되기 때문입니다.

이 게시물을 요약하면 다음과 같습니다.