[R Programming] R 기본 객체와 자료 형태 (1)
R 기본 객체와 자료 형태 (1)
5가지 기본 객체
- Character (문자형)
- Numeric (real numbers) (숫자형, 실수형)
- Integer (정수형)
- Complex (복소수형)
- Logical (True/False) (논리형)
R에서의 자료 형태
- Vector (벡터)
- Matrix (메트릭스 = 행렬)
- List (리스트)
- Factor (범주형)
- Data Frame (데이터 프레임)
벡터
벡터 (Vector)
- 같은 종류의 객체들만을 포함하는 자료 형태
- 1차원 배열
- 벡터 생성하기
x <- c(0.5, 0.6) ## numeric
x <- c(TRUE, FALSE) ## logical
x <- c(T, F) ## logical
x <- c("a", "b", "c") ## character
x <- 9:29 ## integer
x <- c(1+0i, 2+4i) ## complex
실습 - 벡터 (Vector)
- 벡터 생성하기
x <- c(1, 2.5, 3.2) # double
y <- c(1L, 2L, 3L) # integer
z <- c("KTX", "Saemaul", "Mugunghwa") # string
v <- c(TRUE, FALSE, FALSE, TRUE) # logical
- 벡터에서 인덱싱
x[3] # x 의 세 번째 성분
## [1] 3.2
x[c(1,3)] # x 의 첫 번째, 세 번째 성분을 추출한 부분 벡터
## [1] 1.0 3.2
- 벡터에 이름 부여하기
fruit <- c(5, 3, 2)
names(fruit) <- c("apple", "orange", "peach")
fruit
## apple orange peach
## 5 3 2
fruit[c("apple", "peach")]
## apple peach
## 5 2
fruit <- setNames(c(5, 3, 2), c("apple", "orange", "peach"))
- 벡터의 길이 구하기
length(x) # length of x
## [1] 3
- 기존 벡터를 사용하여 새로운 벡터 생성하기
a <- c(1, 2, 3)
b <- c(5, 6)
x <- c(a, 4, b) # x <- c(1,2,3,4,5,6)
- 인덱스 범위가 넘는 자리에 값을 할당하면?
a[7] <- 2
a
## [1] 1 2 3 NA NA NA 2
- 기존 벡터에 객체 삽입하기
append(x, 99, after=3) # x 의 세 번째 성분 다음에 99 삽입
## [1] 1 2 3 99 4 5 6
append(x, -99, after=0) # x 의 맨 앞에 -99 삽입
## [1] -99 1 2 3 4 5 6
- seq(), rep() 를 사용해서 벡터 생성하기
x <- seq(from=0, to=1, by=0.1)
x
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
y <- seq(from=0, to=1, length=11)
y
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
rep(1, 10)
## [1] 1 1 1 1 1 1 1 1 1 1
- 벡터간 산술 연산하기
x <- 1:3; y <- c(2,2,2)
x+y
## [1] 3 4 5
x-y
## [1] -1 0 1
x*y
## [1] 2 4 6
x/y
## [1] 0.5 1.0 1.5
x^y
## [1] 1 4 9
암시적 형변환(Implicit Coercion)
- When different objects are mixed in a vector, implicit coercion occurs so that every element in the vector is of the same class.
y <- c(1.7, "a") ## character [1] "1.7" "a"
y <- c(TRUE, 2) ## numeric [1] 1 2
y <- c("a", TRUE) ## character [1] "a" "TRUE"
📌 Priority : Logical < Numeric < Character
명시적 형변환(Explicit Coercion)
x <- 0:6
class(x)
## [1] "integer"
as.numeric(x)
## [1] 0 1 2 3 4 5 6
as.logical(x)
## [1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE
as.character(x)
## [1] "0" "1" "2" "3" "4" "5" "6"
📌 R can’t figure out how to coerce an object → this ccan result in NAs being produced.
x <- c("a", "b", "c")
as.numeric(x)
## [1] NA NA NA
## Warning message:
## NAs introducecd by coercion
as.logical(x)
## NA NA NA
as.complex(x)
## [1] NA NA NA
## Warning message:
## NAs introducecd by coercion
실습 - 통계함수 사용하기
- 정규분포를 따르는 난수 발생시키기
x <- rnorm(10)
x
## [1] -0.34246270 0.58343596 1.54340829 -1.68275292 -0.07331261
## [6] 1.02802626 -0.71574842 -0.62199705 0.03085437 -1.39492435
y <- 1:10
y
## [1] 1 2 3 4 5 6 7 8 9 10
z <- -5:4
z
## [1] -5 -4 -3 -2 -1 0 1 2 3 4
max(x) # 최대값
min(x) # 최소값
sum(x) # 모든 성분의 합
prod(x) # 모든 성분의 곱
mean(x) # 평균
median(x) # 중앙값
range(x) # 최대값과 최소값의 차이
quantile(x, probs=c(0.2, 0.7)) # 분위수
var(x) # 분산
sd(x) # 표준편차
cov(x, y) # 공분산
cor(x, y) # 상관계수
cumsum(x) # 누적합
cumprod(x) # 누적곱
cummax(x) # 누적최대값
cummin(x) # 누적최소값
pmax(x, y, z) # 성분별 최대값
pmin(x, y, z) # 성분별 최소값
메트릭스 (Matrix)
- 행렬의 수학적 의미
- 수나 기호, 수식 등을 네모꼴로 배열한 것
- 행렬 안에 배열된 구성원들을 성분(entry) 또는 항, 원소(element)라고 함
- 행렬의 가로줄을 행(row), 세로줄을 열(column)
- m개의 행, n개의 열로 이루어진 행렬 → m x n 행렬 (m by n matrix)
메트릭스 (Matrix) 생성하기
- 방법 1: matrix 함수를 사용
m <- matrix(nrow = 2, ncol = 3)
m
## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA
📌 “column-wise” 형태로 값을 구성함 (왼쪽 상단부터 값이 채워짐)
- 방법 2: dim 함수를 사용
m <- 1:10
m
dim(m) <- c(2,5)
m
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
- 방법 3: cbind 혹은 rbind 함수를 사용
x <- 1:3
y <- 10:12
cbind(x, y)
## x y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
rbind(x, y)
[,1] [,2] [,3]
x 1 2 3
y 10 11 12
실습 - 메트릭스
- 다양한 방법으로 메트릭스 생성하기
z <- matrix(1:20, 4, 5)
z
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [1,] 3 7 11 15 19
## [2,] 4 8 12 16 20
z <- matrix(2, 4, 5)
z
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 2 2 2 2
## [2,] 2 2 2 2 2
## [1,] 2 2 2 2 2
## [2,] 2 2 2 2 2
z <- matrix(c(1, 2, 3,
4, 5, 6),
nrow = 2, ncol = 3, byrow=T)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
- 기본 벡터 혹은 행렬을 결합해서 새로운 행렬을 생성하기
x <- 1:4
y <- 5:8
cbind(x, y)
## x y
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
rbind(x, y)
## [,1] [,2] [,3] [,4]
## x 1 2 3 4
## y 5 6 7 8
- 기본 벡터 혹은 행렬을 결합해서 새로운 행렬을 생성하기
B <- matrix(0, 4, 5)
cbind(B, 1:4)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0 0 0 0 0 1
## [2,] 0 0 0 0 0 2
## [1,] 0 0 0 0 0 3
## [2,] 0 0 0 0 0 4
A <- matrix(1:20, 4, 5)
B <- matrix(1:20, 4, 5)
C <- bind(A, B)
C
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 5 9 13 17 1 5 9 13 17
## [2,] 2 6 10 14 18 2 6 10 14 18
## [1,] 3 7 11 15 19 3 7 11 15 19
## [2,] 4 8 12 16 20 4 8 12 16 20
- 행렬간 산술연산
A+B
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 10 18 26 34
## [2,] 4 12 20 28 36
## [1,] 6 14 22 30 38
## [2,] 8 16 24 32 40
A-B
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
A*B
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 25 81 169 289
## [2,] 4 36 100 196 324
## [1,] 9 49 121 225 361
## [2,] 16 64 144 256 400
A/B
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 1 1 1 1
## [2,] 1 1 1 1 1
## [3,] 1 1 1 1 1
## [4,] 1 1 1 1 1
- 행렬의 각 행과 열에 이름을 부여하기
z <- matrix(1:20, 4, 5) z ## [,1] [,2] [,3] [,4] [,5] ## [1,] 1 5 9 13 17 ## [2,] 2 6 10 14 18 ## [3,] 3 7 11 15 19 ## [4,] 4 8 12 16 20 colnames(z) <- c("alpha", "beta", "gamma", "delta", "eps") rownames(z) <- c("a", "b", "c", "d") z ## alpha beta gamma delta eps ## a 1 5 9 13 17 ## b 2 6 10 14 18 ## c 3 7 11 15 19 ## d 4 8 12 16 20
📌 행렬의 인덱싱
댓글남기기