Intro) 아래 내용은 R의 기본적인 문법이나 자주 사용되는 라이브러리에 대해 앞으로 정리한 것입니다. 강필성 교수님의 [데이터 분석을 위한 프로그래밍 언어] 강의와 기타 자료들을 토대로 한 내용이지만 야매로 정리하다 보니 오류가 있을 수도 있습니다. 피드백 주시면 빠르게 수정하도록 하겠습니다.

1) matrix의 개요

matrix는 일반적으로 행렬이라고 번역되는 데이터 형태로 '차원(dimension)을 가지는 vector'라고 정의할 수 있습니다. 정의에서 알 수 있듯이 matrix의 뿌리는 vector이며 따라서 vector를 matrix로 변환할 수 있고 vector 뿐만 아니라 list 또한 vector로 변환이 가능합니다.  아래와 같이 A라는 vector와 B라는 list를 만들고 각각에 2X5차원을 부여하게 되면 matrix 형태로 변환이 됩니다. 

#### matrix의 차원 개념 ####
# 1부터 10까지의 vector생성
A <- 1:10 
dim(A)
print(A)

# vector를 차원을 가지는 matrix로 변환
dim(A) <- c(2,5)
print(A)

vector를 matrix 형태로

#### matrix의 차원 개념 ####
# 1부터 10까지의 list생성
B <- list(1,2,3,4,5,6)
print(B)
dim(B)

# list를 차원을 가지는 matrix로 변환
dim(B) <- c(2,3)
print(B)

list를 matrix 형태로

matrix의 특징을 살펴보면 vector와 크게 차이가 없습니다. 기본적으로 인덱스는 1부터 시작하게 됩니다. 앞서 살펴보았던 vector, list 모두 첫번째 인덱스 값은 1이었고 vector 또한 마찬가지입니다. 한편, matrix는 차원을 가지기 때문에 행(row)과 열(column)의 개념을 가지게 됩니다. 따라서, 값을 주어 이를 matrix 형태로 표현하기 위해서는 값들을 어떤 식으로 배열할 것인지가 중요하게 됩니다. R에서 matrix는 열 우선(column-major order)의 배열 구조를 default로 하고 있습니다. 물론, matrix() 함수의 파라미터를 행 우선으로 하여 matrix를 생성할 수 있습니다. 이는 아래에서 직접 R스크립트를 통해 살펴보도록 하겠습니다.

열을 기준으로 하여 matrix가 구성되어 있다

아래 2개의 그림을 통해 열 우선의 배열(colmun-major order)과 행 우선의 배열(row-major order)을 시각적으로 확인해보겠습니다. 

출처: https://huilife.tistory.com/15

2) matrix 생성

matrix를 만드는 방법을 알아보도록 하겠습니다. 앞선 포스트에서 vector와 list를 만드는 다양한 방식들이 있었듯이 matrix  또한 생성하는 방법이 여러가지가 있습니다. 세 방식 모두 matrix() 함수를 사용하지만 세부적인 파라미터 값을 달리하거나 순서를 달리하여 matrix를 생성하게 됩니다. 첫 번째는 가장 일반적인 방법으로 1) matrix의 모든 요소값과 함께 행과 열을 지정해주는 것입니다. 아래와 같이 matrix() 안에 1:12까지의 element, nrow =4, ncol =3를 넣게 되면 1부터 12까지 4X3 형태의 matrix가 완성된다. 이때 행과 열의 값은 element의 값과 호환이 되어야 한다. 가령, 1부터 20까지의 element를 가지고 matrix를 만들기 위해서는 1X20, 2X10, 4X5, 5X4, 10X2, 20X1와 같이 matrix의 크기가 element의 수와 일치해야 한다. 또한, 이러한 점 때문에 행의 수나 열의 수가 결정되면 자동적으로 반대의 열과 행의 수가 결정되기 때문에 굳이 nrow 값과 ncol 값 두 가지 다 넣지 않더라도 하나의 값만 가지고도 matrix를 생성할 수 있다. 아래 R스크립트 결과를 통해 각각의 경우를 살펴보겠습니다. 

앞서 matrix()의 파라미터를 통해 열 우선 배열을 행 우선 배열로 설정할 수 있다고 했는데 다음의 결과를 통해 확인해보겠습니다. 위의 결과와 달리 1,2,3,4,5,6,7,8... 의 배열이 행을 기준으로 나열되어 있습니다. 이처럼 byrow = TRUE를 설정해주면 열 기준의 배열을 행 기준의 배열로 바꿀 수 있습니다. 

matrix를 생성하는 두 번째 방법은 2) 빈 matrix를 만들고 각 element를 직접 채우는 것입니다. 그다지 추천할 만한 방법은 아니지만 이러한 방식으로도 가능하다는 점을 알려드리고 이 원리를 이용하면 생성된 matrix의 element를 다른 값으로 바꿀 수도 있습니다. 아래 R스크립트 결과를 보면 2X2 형태의 빈 matrix를 만들고 각각의 위치에 원하는 값을 직접 입력하게 됩니다. 

이처럼 각 위치 값을 인덱싱하여 값을 부여할 수 있다는 것은 새로운 값으로 대체할 수도 있다는 것을 의미합니다. 1행 1열의 값이 원래 1로 설정되어 있는데 이를 10으로 바꿔보도록 하겠습니다.  

#### matrix 생성 ####
# 행과 열을 지정해 matrix 생성
A = matrix(1:12, nrow=4, ncol=3)
A

# nrow 값만 가지고 matrix 생성
A = matrix(1:12, nrow=4)
A

# ncol 값만 가지고 matrix 생성
A = matrix(1:12, ncol=3)
A

# byrow 인자를 통해 행 우선 배열의 matrix 생성
B = matrix(1:12, nrow=4, byrow = T)
B

# 빈 matrix를 채우는 방식으로 생성
C = matrix(nrow=2,ncol=2)
C[1,1] = 1
C[1,2] = 2
C[2,1] = 3
C[2,2] = 4
C

# 1행 1열의 값을 10으로 바꾸기
C[1,1] = 10
C

'Python-R' 카테고리의 다른 글

[R] 데이터 타입 - List  (0) 2022.07.01
[R] 데이터 타입 - Vector  (0) 2022.06.30

Intro) 아래 내용은 R의 기본적인 문법이나 자주 사용되는 라이브러리에 대해 앞으로 정리한 것입니다. 강필성 교수님의 [데이터 분석을 위한 프로그래밍 언어] 강의와 기타 자료들을 토대로 한 내용이지만 야매로 정리하다 보니 오류가 있을 수도 있습니다. 피드백 주시면 빠르게 수정하도록 하겠습니다.

1) list 특징과 생성

list에 대해 살펴보도록 하겠습니다. list는 vector와 달리 이질적(heterogeneous)인 요소들로 구성이 가능합니다. 이 점 때문에 list를 handling하는 방식이 vector와는 살짝 차이가 있습니다. 리스트에서 인덱싱할 때는 2가지 방법이 있습니다. 대괄호([])를 2번 사용하거나 1번 사용할 수 있는데 이때 출력되는 결과물에 차이가 있습니다. 아래 스크립트를 직접 실행해보면서 차이를 보도록 하겠습니다. listA[[1]]와 같이 2번 사용하게 되면 결과는 element로 출력됩니다. 반면, listA[1]와 같이 1번 사용하게 되면 결과는 list형태로 출력이 됩니다.

# listA 생성
listA <- list(1, 2, "a")
print(listA)

# listA에 대괄호[] 2개를 사용하면 element로 호출
listA[[1]]

# listA에 대괄호[] 1개를 사용하면 list로 호출
listA[1]

# c()함수를 사용해 인덱싱 가능
listA[c(1,2)]

한편, list에도 vector처럼 이름을 부여할 수 있고 이름을 통해 인덱싱할 수 있습니다. 이름을 통해 호출할 때에는 대괄호([])를 2번 사용하거나 '$'기호를 사용해서 인덱싱할 수 있습니다. 아래 스크립트에 대한 결과물을 통해 확인이 가능합니다. 

# 벡터와 마찬가지로 이름을 부여할 수 있고 이름을 통해 호출 가능
names(listA)
names(listA) <- c("First", "Second", "Third")

# 이름을 통해 호출 할 때는 대괄호[] 2개를 사용하거나 $를 사용하여 호출
listA[["Third"]]
listA$Third

다음 스크립트는 list를 만드는 다양한 방법들을 보여주고 있습니다. 일반적으로 첫번째 방식이 가장 보편적으로 사용되지만 다양한 방법을 통해서도 list를 생성할 수 있다는 점을 알아두시면 됩니다. 

# list를 만드는 다양한 방법
# name과 value를 함께 list로 만들기
A <- list(name="lee", salary = 10000, union = TRUE)
print(A)

# value만을 가지고 list 만들고
B <- list("lee", 10000, TRUE)
names(B) <- c('name', 'salary', 'union')
print(B)

# vector()에 mode를 list로 하여 list를 만들고 이름과 값을 각각 부여 
C <- vector(mode="list")
C[["name"]] <- "lee"
C[["salary"]] <- 10000
C[["union"]] <- TRUE
print(C)

리스트 A, B, C 모두 값은 결과를 보임

2) list 응용

리스트에 새로운 값을 추가하거나 삭제하는 방법은 아래 스크립트를 통해 확인할 수 있습니다. C$office <- "frontier" 로 'office'라는 name에 'frontier'라는 value 값을 넣을 수 있고 반대로 C$salary <- NULL 을 통해 기존에 있던 salaray 값을 삭제할 수 있습니다.

# C에 새로운 value와 name 추가
C$office <- "frontier"
C

# C에서 salary에 해당하는 값 삭제
C$salary <- NULL
C

리스트에 새로운 값 추가하고 삭제한 결과

list 안에 list가 포함된 재귀적 list를 생성하고 이를 다시 vector로 분해하여 반환하는 unlist()까지 살펴보겠습니다. unlist()를 사용할 때 use.names = FALSE로 설정해주면 name 없이 value만 문자형 vector로 반환하게 됩니다. 

# 재귀list 생성
tmplist <- list(a = list(1:5, c("a","b","c")), b = "Z", c = NA)
tmplist

# list에서 element를 분해하여 문자형 vector로 반환
unlist(tmplist)
unlist(tmplist, use.names = FALSE)

# list에 함수 적용하기 전 A 생성
A <- list(1:3,25:29)
A

# lapply는 list형태로 반환하고 sapply는 vector나 matrix형태로 반환
lapply(A,median)
sapply(A,median)

'Python-R' 카테고리의 다른 글

[R] 데이터 타입 - Matrix  (0) 2022.07.06
[R] 데이터 타입 - Vector  (0) 2022.06.30

Intro) 데이터 분석을 할 때 저는 주로 Python을 이용하지만 가끔 R을 필요로 할 때가 있습니다. 아무래도 상황에 따라 R에서 코드가 더 간단할 때도 있고, 특히 고급통계 분석이나 시각화의 경우 육안으로 깔끔한 분석이 가능하기에 R이 편할 때도 있습니다. 그런데 R과 Python 간에는 미묘한 syntex 차이가 있어서 Python을 메인으로 사용하는 입장에서 오랜만에 R을 사용할 때면 헷갈리는 점들이 있습니다. 그래서 나중에 헷갈리는 부분들을 빠르게 찾아보기 위해 R의 기본적인 문법이나 자주 사용되는 라이브러리에 대해 앞으로 정리해보고자 합니다. 강필성 교수님의 [데이터 분석을 위한 프로그래밍 언어] 강의와 기타 자료들을 토대로 한 내용이지만 야매로 정리하다 보니 오류가 있을 수도 있습니다. 피드백 주시면 빠르게 수정하도록 하겠습니다.

1) 데이터 타입의 종류

R의 데이터 타입 중 Vector에 대해 간단히 살펴보도록 하겠습니다. Vector 타입에 대해 알아보기 전에 우선 데이터 타입에는 무엇이 있는지 살펴보겠습니다. 아래 그림처럼 scalar부터 다차원 배열의 tensor까지 여러 종류의 데이터 타입이 있지만 기초적인 데이터 분석에서는 vector와 matrix 그리고 dataframe이 가장 중요합니다.

출처: https://wikidocs.net/37001

데이터 타입을 구분하는 2가지 기준이 있습니다. 번째는 변수(variables)들이 동질적(Homogeneous)인지 이질적(Heterogeneous)인지, 번째는 관측치(observation) 개인지 여러 개인지입니다. 동질적(Homogeneous)이라는 것은 예를 들어 변수들이 모두 숫자형으로 형태가 모두 같아야 하는 것이고 이질적(Heterogeneous)이라는 것은 숫자형, 문자형, 명목형 변수 여러 형태가 섞여있는 것을 말합니다. 기준을 가지고 데이터 타입을 구분하면 아래 표와 같을 있습니다. 아래 표에서 조금 헷갈릴 수도 있는게 관측치가 1개이고 동질적이면 scalar 아닌가 생각될 있습니다. scalar라고 해도 되고 길이가 1 Vector라고 있습니다

2) 데이터 타입 - Vector(1)

R에서 '<-' 통해 A라고 선언한 변수에 c(15, 25, 35) 같이 값의 결합을 넣어주면 벡터가 완성됩니다. Python에서 변수를 선언하고 값을 대입하는 방식과는 달라 조금은 생소하게 느껴집니다. 이때 주의할 점은 이전 [데이터 타입의 종류] 공부할 살펴 보았듯이 vector 동질적(homogeneous) 값으로 구성되어야 합니다. 따라서 B 벡터와 같이 숫자형과 문자형 값을 함께 주게 되면 R 숫자인 값을 문자형으로 처리하여 'character' 인식하게 됩니다

# A와 B 벡터에 값 부여
A <- c(15,25,35)
B <- c(1, "A", 0.5)

# A벡터는 숫자형 B벡터는 문자형으로 인식
mode(A)
mode(B)

파이썬에서와 마찬가지로 R에서 인덱싱하는 방식은 비슷합니다. [1], [2:3] 같이 대괄호 안에 호출하고 싶은 값의 인덱스를 넣어주면 됩니다. , R에서는 다른 언어들과 달리 인덱스가 1부터 시작하게 됩니다. 점만 주의해주시면 됩니다. 그리고 A[c(2,3)] 같이 concatenating 함수를 이용해 인덱싱할 수도 있습니다. 그리고 벡터 값에 이름을 부여하여 이름을 통해서도 인덱싱할 수도 있습니다. 아래 스크립트를 콘솔 창에 직접 입력하여 하나씩 확인해보시면 쉽게 이해하실 있을 것입니다

# 벡터 값을 추출하는 방법(=파이썬의 인덱싱)
A[1]
A[2:3]
A[c(2,3)]

# 벡터에 이름 부여
names(A)
names(A) <- c("First", "Second", "Third")

# 인덱스 또는 이름을 통해 값 호출 가능
A[1]
A["First"]

벡터에 이름을 부여하면 그냥 num에서 Named num으로 바뀜

'Python-R' 카테고리의 다른 글

[R] 데이터 타입 - Matrix  (0) 2022.07.06
[R] 데이터 타입 - List  (0) 2022.07.01

+ Recent posts