8 min to read
R-Studio 행렬 다루기(Matrix)
R-Studio 행렬을 다루어 보기(Matrix, Vector)
R-Studio 기본 자료형 Vector
Vector 은 배열 이라고 보아도 무방하다.
Vector 은 c(요소, 요소…)로 생성한다.
Vector 과 List 는 비슷하지만 1차원 배열과 2차원 배열 차이라고 봐도된다.
실수형 과 정수형 둘다 Num형 이다.
R은 1베이스 시작이다 즉, 배열 Index가 1부터 시작한다.
사용된 함수
이름 | 함수이름 | 사용법 |
---|---|---|
Vector | c() | Numeric : c(1, 2, 3, 4) Char : c(“가”, “나”, “다”, “라”) |
List | list() | list(c(1, 2, 3, 4), c(‘a’, ‘b’, ‘c’)) |
List->Vector | unlist() | unlist(리스트변수) |
Matrix | matrix() | matrix(vector, nrow = [정수 값]) |
Structure | str() | str(조회 하고자 하는 변수) |
Vector와 List
# 아래 주석은 콘솔 값 입니다.
### Vector
myVector <- c(1, 2, 3, 4, 5, 6) # 벡터를 생성한다. 요소는 Numeric형 6개
# [1] 1 2 3 4 5 6
str(myVector) # 생성한 벡터의 변수 myVector의 구조를 확인한다.
# num [1:6] 1 2 3 4 5 6
# Numeric 형태 이며, [1행 6열]의 형태이다.
myVector_Double <- c(1.1, 1.2, 1.3, 1.4) # 실수형 자료형을 Vector에 넣고
str(myVector_Double) # 그 변수의 구조를 확인해보자.
# num [1:4] 1.1 1.2 1.3 1.4
# 역시 Numeric 형태이다.
# JAVA, C++, C# 등은 정수, 실수, 문자, 문자열 형태의 자료형이 뚜렷하게 나뉘지만
# R은 그러지 않고 애매모호 하다.
### List함수
myLists <- list(c(1, 2, 3, 4, 5), c('a', 'b', 'c')) # List를 생성한다.
myLists # 그리고 출력 해본다.
# [[1]]
# [1] 1 2 3 4 5
#
# [[2]]
# [1] "a" "b" "c"
# JAVA로 바꾸어 보면 [0][1] ~ [0][5] 배열 Index가
# R은 [[1]][1:5] 인 것이다. 실제로 인덱싱을 해본다면.
myLists[[1]][1:5]
# [1] 1 2 3 4 5 으로 나온다. 그렇다면 2행 으로 접근 하려면?
myLists[[2]][1:5]
# [1] "a" "b" "c" NA NA 그렇다. [[2]]로 바꿔 주면 된다!
# 그런데 NA는 무엇인가? 그렇다! NULL 값이라 보면된다. 0도 아니고 공백도 아닌 NULL 값이다.
str(myLists) # 구조를 출력 해 본다.
# List of 2 (2개의 리스트 구조 를 가지고 있다)
# $ : num [1:5] 1 2 3 4 5 (1행은 Numeric)
# $ : chr [1:3] "a" "b" "c" (2행은 Char)
Matrix 함수
mat_a <- matrix(myVector, nrow = 3) # 행렬 구조를 만든다.
# 이때 matrix 함수의 인자값 중 첫번째는 미리 생성해둔 Vector 변수를 넣고
# 두번째 인자 값으로는 nrow = 정수값을 넣는다.
# 일단 출력 해보자.
mat_a
# [,1] [,2]
# [1,] 1 4
# [2,] 2 5
# [3,] 3 6
# 기왕 한거 구조까지 출력 해보자!
> str(mat_a)
# num [1:3, 1:2] 1 2 3 4 5 6
# num [행, 열] 값이다. 즉, 행은 1행 3열 이다. 즉, 1행 3열 벡터를 세로로 눕힌거다.
# 그렇담 오른쪽은? 열이 1행 2열 상태로 있는것이다. 가로로 말이다.
# 쉽게 보자면 3행 2열 인것이다.
### Matrix의 nrow는..?
mat_b <- matrix(myVector, nrow = 2)
mat_b
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# 근데 사실 이쯤 되면 눈치 챘을것이다.
# 그렇다! nrow = 2 는 2행 을 먼저 맞추고 나머지는 열로 나열하는 것!
# nrow = 3 이면? 위처럼 1 2 3을 행 우선으로 1 2 3 을 나열 하고 그 다음
# 열로 넘어가 4 5 6을 행 우선 나열한다!
# 그렇다면 nrow = 1로 한다면? 해보면 되지!
mat_b <- matrix(myVector, nrow = 1)
mat_b
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 2 3 4 5 6
# 음! 우리가 원하는 모습은 아니다! 이해를 돕기위한 극단적인 방법이다.
# 그렇다면 열우선 으로 나열 하려면?
# 열우선 맵핑
mat_c <- matrix(myVector, nrow = 2, byrow = T) # byrow = T 옵션
mat_c
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# 그렇다! 열 우선으로 1, 2, 3을 나열 하고 그 다음 행으로 넘어간다!
# nrow 옵션으로 행의 갯수를 정하고, byrow 를 T로주면 속성 원자값 들을 열우선으로
# byrow 을 기재하지 않는다면 송성 원자 값들을 행 우선으로 나열 해준다.
Matrix 함수의 다른 옵션
# 어트리뷰트 속성명 설정 해줌.
mydim <- list( c("김", "박"), c("국어", "영어", "수학") ) # list 생성
mat_d <- matrix(myVector, nrow=2, byrow = T, dimnames = mydim)
# dimnames = 행, 컬럼 리스트
# list로 행, 열 순서대로 레이블(label) 을 만들어 주고 변 수에 넣어준다.
# dimnames = 변수 인자로 행 과 열의 이름을 원하는 것으로 바꾼다.
mat_d
# 국어 영어 수학
# 김 1 2 3
# 박 4 5 6
# 신기방기 하다.
str(mat_d)
# num [1:2, 1:3] 1 4 2 5 3 6
# - attr(*, "dimnames")=List of 2
# ..$ : chr [1:2] "김" "박"
# ..$ : chr [1:3] "국어" "영어" "수학"
# 속성 원자 값은 numeric 형 2행[1:2] 3열[1:3]을 가지고 있다.
# 그 순서는 먼저 김, 박 레이블, 그리고 국어 영어 수학 레이블이다.
# seq를 이용한 벡터 인덱싱
somedata <- seq(10, 100, by=10)
somedata
# [1] 10 20 30 40 50 60 70 80 90 100
# 9번째 요소 출력
somedata[9]
# 1~3번째 요소 출력
somedata[1:3]
# 요소만 따로 출력
somedata[c(1, 3, 7)]
# [1] 10 30 70
# 첫번재 요소만 제외하고 출력
result = somedata[-1]
result
# [1] 20 30 40 50 60 70 80 90 100
# 1부터 3까지를 제외하고 출력
# result0 = somedata[-c(1:3)]
result0 = somedata[-(1:3)]
result0
# [1] 40 50 60 70 80 90 100
# 50 제외 전부 출력
result1 = somedata[ somedata != 50 ]
result1
# [1] 10 20 30 40 60 70 80 90 100
# 70이상 요소만 출력
result2 = somedata[ somedata >= 70 ]
result2
# [1] 70 80 90 100
어찌된게 JAVA나 C++보다 어려운게 R인것 같다.
오픈소스 이므로 같은 기능이지만 다른 함수들이 굉장히 많다.
분석가나 개발자가 익혀야할 함수들이 엄청나게 많다…
하지만 생각보다 짧은 코드로 많은 효과를 낼 수 있는 언어인것 같다.
이와 밀접하게 Python 언어가 있다.
Comments