Description R Data Type and Structure
정수(Integer)
,
실수(Double)
, 복소수(Complex)
로 나뉜다.
L
기호를 사용하면 정수, 그렇지 않으면 실수로
간주한다.i
기호를 사용하면 복소수의 허수로 간주한다.Caution!
함수 class()
로 데이터의 유형을
확인할 수 있으며, 그 외에도 함수 typeof()
, 함수
mode()
를 사용할 수 있다.
Result!
실수형은 함수 class()
를 사용하면
numeric
으로 출력한다.
# 복소수(Complex))
x <- c(1+1i, 2+2i, 3+4i, 5+2i)
x
[1] 1+1i 2+2i 3+4i 5+2i
# 데이터 유형 확인NAclass(x)
[1] "complex"
작은따옴표('텍스트')
또는
큰따옴표("텍스트")
로 표현한다.Result!
숫자도 ‘10’ 또는 “10”처럼 따옴표로 묶여 있으면
문자형이 된다.
TRUE (T)
또는
FALSE (F)
로 표현한다.
TRUE (T)
는 참을 의미하고, FALSE (F)
는
거짓을 의미한다.true
또는
false
와 다르다.FALSE
는 0
이고 TRUE
는
0 이외의 숫자
로 표현할 수 있다.Caution!
R에서 TRUE
는 숫자 1을 나타내고
FALSE
는 숫자 0으로 인식한다.
Result!
\(x+y+z=1+0+1=2\)를 출력한다.
factor()
를 사용하며, 일반적으로
범주(Levels)는 알파벳 순서 또는 오름차순으로 자동 지정된다.Caution!
순서척도는 함수 ordered()
를
사용하여 생성할 수도 있다.
NULL | 존재하지 않는 객체를 지정할 때 사용 |
NA | Not Available의 약자로 결측치(Missing Value)를 의미 |
NaN | Not a Number의 약자로 수학적으로 연산이 불가능한 경우를 의미 |
Inf | Infinite의 약자로 양의 무한대를 의미 |
-Inf | 음의 무한대를 의미 |
Result!
R에서 NULL
은 값이 없다고 생각하기
때문에 출력되지 않으며 x의 길이는 4가 된다.
Result!
R에서 NA
는 NULL
과
다르게 값이 출력되며 x의 길이는 5가 된다.
# NaN
0/0
[1] NaN
# Inf
1/0
[1] Inf
# -Inf
-1/0
[1] -Inf
is.데이터 유형()
을 이용하여 데이터 유형을 확인할
수 있다.
TRUE
또는 FALSE
이다.[1] TRUE
is.integer(x)
[1] FALSE
is.numeric(x)
[1] TRUE
is.character(x)
[1] FALSE
is.logical(x)
[1] FALSE
as.데이터 유형()
을 이용하여 데이터 유형을 변환할
수 있다.x <- c(1, 0, 3, 5)
is.integer(x)
[1] FALSE
# 정수형 변환
y <- as.integer(x)
y
[1] 1 0 3 5
is.integer(y)
[1] TRUE
# 문자형 변환
z <- as.character(x)
z
[1] "1" "0" "3" "5"
is.character(z)
[1] TRUE
# 범주형 변환xx <- as.factor(x)
xx
[1] 1 0 3 5
Levels: 0 1 3 5
is.factor(xx)
[1] TRUE
# 논리형 변환환
yy <- as.logical(x)
yy
[1] TRUE FALSE TRUE TRUE
Result!
0 이외의 숫자는 TRUE
, 0은
FALSE
로 변환한다.
is.logical(yy)
[1] TRUE
벡터(Vector)
, 행렬(Matrix)
,
배열(Array)
은 동일한 유형의 데이터를 원소로 가지는 반면,
데이터 프레임(Data Frame)
과 리스트(List)
는
서로 다른 유형의 데이터를 원소로 가질 수 있다.c()
를 이용하여 생성한다.x <- 3
x
[1] 3
Caution!
원소가 하나인 벡터를 스칼라(Scalar)라고 하며,
스칼라를 만들 때에는 함수 c()
를 사용하지 않아도 된다.
x <- c(1, 2, 6, 10, 11, 103)
x
[1] 1 2 6 10 11 103
x <- c(TRUE, FALSE, TRUE, TRUE)
x
[1] TRUE FALSE TRUE TRUE
x <- c("가"","나"나""다"다""라")")
x
[1] "가" "나" "다" "라"
Caution!
다른 유형의 데이터가 벡터에 뒤섞여 있다면 더
복잡한 형태의 유형으로 강제 변환되며, 복잡한 유형은 문자형(Character)
\(>\) 복소수형(Complex) \(>\) 숫자형(Numeric) \(>\) 논리형(Logical)이다.
Result!
숫자형과 문자형으로 구성된 벡터는 문자형
데이터로 통일된다.
# 다른 유형으로 구성된 벡터벡터
x <- c(TRUE, "가"","다"))
x
[1] "TRUE" "가" "다"
# 데이터 유형 확인NAclass(x)
[1] "character"
Result!
논리형과 문자형으로 구성된 벡터는 문자형
데이터로 통일된다.
Result!
논리형과 숫자형으로 구성된 벡터는 숫자형
데이터로 통일된다.
c()
를 이용하여 할 수 있다.콜론(:) 연산자
또는 함수 seq()
를 이용하여
일정한 간격이 있는 자료를 쉽게 생성할 수 있다.
콜론(:) 연산자
는 연산자의 왼쪽 숫자에서 시작하여 오른쪽
숫자를 초과하지 않을 때까지 1씩 증가하는 수열을 생성한다. 만약, 왼쪽의
숫자가 오른쪽의 숫자보다 크면 1씩 감소하는 수열을 생성한다.seq(from, to, by)
는 from
에서
to
까지 by
만큼 증가(감소)하여 간격이 일정한
수열을 생성한다.rep()
를 이용하여 반복된 패턴이 있는 자료를
간편하게 생성할 수 있다.
times
는 데이터 전체를 지정된 횟수만큼 반복시키며,
옵션 each
는 데이터의 요소들이 각각 each번 반복한다.# 콜론 연산자1:5
[1] 1 2 3 4 5
-3:3
[1] -3 -2 -1 0 1 2 3
1.5:5.4
[1] 1.5 2.5 3.5 4.5
5:-3
[1] 5 4 3 2 1 0 -1 -2 -3
# seq
seq(from = 1, to = 10, by = 3)
[1] 1 4 7 10
seq(from = 6, to = 0, by = -2)
[1] 6 4 2 0
seq(from = 1, to = 6, by = 1.8)
[1] 1.0 2.8 4.6
# rep
rep(1, times = 2)
[1] 1 1
rep(1:5, times = 5)
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
[1] "M" "F" "M" "F" "M" "F"
[1] "M" "M" "M" "M" "M" "F" "F" "F" "F" "F" "F" "F" "F"
rep(1:5, each = 5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5
[1] "M" "M" "M" "F" "F" "F"
# 벡터와 스칼라의 연산산
x <- c(1, 10, 3, 4, 6)
x+3
[1] 4 13 6 7 9
x-3
[1] -2 7 0 1 3
x*3
[1] 3 30 9 12 18
x/3
[1] 0.3333333 3.3333333 1.0000000 1.3333333 2.0000000
x^3
[1] 1 1000 27 64 216
[1] 10 13 5 15 10
x-y
[1] -8 7 1 -7 2
x*y
[1] 9 30 6 44 24
x/y
[1] 0.1111111 3.3333333 1.5000000 0.3636364 1.5000000
x^y
[1] 1 1000 9 4194304 1296
대괄호[]
를 인덱싱 기호로 사용한다.Result!
벡터 x의 1, 4, 3번째 자리의 원소만 출력한다.
x[-c(1, 4, 3)]
[1] 9 1 8
Result!
벡터 x의 1, 4, 3번째 자리의 원소를 제외한
원소들을 출력한다.
x[10]
[1] NA
Result!
지정한 위치가 벡터의 길이보다 크기 때문에
결측값인 NA
를 출력한다.
x[x>3]
[1] 5 9 10 8
Result!
논리형 벡터에 의한 인덱싱의 경우에는
TRUE
인 자료가 선택된다.
matrix()
를 이용하여 생성한다.
nrow
와 ncol
를 이용하여 각각 지정할 수 있다.
nrow
혹은 ncol
둘 중 하나만
사용해도 된다.byrow
를 이용하여 행 단위로 벡터를 채울 것인지
지정할 수 있다.
byrow = FALSE
로 열 단위로 벡터가
채워진다. [,1] [,2]
[1,] 1 3
[2,] 10 5
[3,] 3 9
[4,] 6 7
Caution!
행렬 생성에 유용하게 사용되는 또 다른 함수로
함수 cbind()
와 rbind()
가 있다. 함수
cbind()
는 기존의 벡터들을 열 단위로 묶어서 행렬을 만들 때
사용할 수 있고, 함수 rbind()
는 벡터들을 행 단위로 묶어서
행렬을 구성할 때 사용할 수 있다. 또한, 두 함수는 기존의 행렬에 열 또는
행을 추가하는 경우에도 사용할 수 있다.
Caution!
함수 cbind()
와
rbind()
를 사용할 때 결합 대상이 되는 벡터들의 길이가 서로
다르면 순환법칙이 적용된다.
x y z
[1,] 1 10 10
[2,] 4 8 10
[3,] 6 10 10
[4,] 5 8 10
[5,] 2 10 10
Result!
y와 z의 원소들이 x의 원소 길이에 맞추어
반복되었다.
Caution!
함수 rownames()
와
colnames()
로 행렬의 행과 열에 이름을 붙일 수 있다.
x <- c(1, 4, 6)
y <- c(10, 8, 7)
z <- cbind(x, y)
rownames(z) <- c("a", "b", "c")
colnames(z) <- c("one", "two")
z
one two
a 1 10
b 4 8
c 6 7
Caution!
함수 nrow()
, ncol()
,
dim()
으로 행렬의 행, 열, 차원을 확인할 수 있다.
[,1] [,2]
[1,] 1 2
[2,] 3 4
y
[,1] [,2]
[1,] 5 10
[2,] 8 3
x+y
[,1] [,2]
[1,] 6 12
[2,] 11 7
x-y
[,1] [,2]
[1,] -4 -8
[2,] -5 1
x/y
[,1] [,2]
[1,] 0.200 0.200000
[2,] 0.375 1.333333
x*y
[,1] [,2]
[1,] 5 20
[2,] 24 12
# 행렬곱x%*%y
[,1] [,2]
[1,] 21 16
[2,] 47 42
# 각 열의 평균
colMeans(x)
[1] 2 3
# 각 열의 합
colSums(x)
[1] 4 6
# 각 행의 평균NArowMeans(x)
[1] 1.5 3.5
# 각 행의 합NArowSums(x)
[1] 3 7
# 행렬의 대각원소diag(x)
[1] 1 4
# 대각행렬
diag(1:4)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 2 0 0
[3,] 0 0 3 0
[4,] 0 0 0 4
# 항등행렬NAdiag(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
# 고유값과 고유벡터터
eigen(x)
eigen() decomposition
$values
[1] 5.3722813 -0.3722813
$vectors
[,1] [,2]
[1,] -0.4159736 -0.8245648
[2,] -0.9093767 0.5657675
# 역행렬
solve(x)
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
# 전치행렬NAt(x)
[,1] [,2]
[1,] 1 3
[2,] 2 4
array()
를 이용하여 생성한다.array()
안에 포함되어야 한다.c(행 개수, 열 개수, 행렬 개수)
벡터로 입력된다., , 1
[,1] [,2] [,3]
[1,] 1 3 1
[2,] 2 4 2
, , 2
[,1] [,2] [,3]
[1,] 3 1 3
[2,] 4 2 4
, , 3
[,1] [,2] [,3]
[1,] 1 3 1
[2,] 2 4 2
Result!
벡터 1, 2, 3, 4를 이용하여 행의 개수가 2이고,
열의 개수가 3인 행렬이 3개 생성되었다.
, , 1
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
, , 2
[,1] [,2] [,3]
[1,] 13 17 21
[2,] 14 18 22
[3,] 15 19 23
[4,] 16 20 24
Result!
벡터 1~24를 이용하여 행의 개수가 4이고, 열의
개수가 3인 행렬이 2개 생성되었다.
Caution!
각 차원에 대한 이름은 함수
dimnames()
로 붙일 수 있으며, 문자형 벡터들도 이루어진
리스트를 할당해야 한다.
, , Z = z1
Y
X y1 y2 y3
x1 1 5 9
x2 2 6 10
x3 3 7 11
x4 4 8 12
, , Z = z2
Y
X y1 y2 y3
x1 13 17 21
x2 14 18 22
x3 15 19 23
x4 16 20 24
[행번호, 열번호]
로 원소를 선택할 수
있다.[행번호, 열번호, 행렬번호]
로 원소를 선택할
수 있다.# 행렬x <- matrix(1:10, nrow = 5, byrow = TRUE)
x
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
x[3, 2]
[1] 6
Result!
행렬 x의 3번째 행 2번째 열 원소가
선택되었다.
x[2:3, ]
[,1] [,2]
[1,] 3 4
[2,] 5 6
Result!
행렬 x의 2번째와 3번째 행의 원소들이
선택되었다.
x[ ,1]
[1] 1 3 5 7 9
Result!
행렬 x의 1번째 열의 원소들이 선택되었다.
, , 1
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
, , 2
[,1] [,2] [,3]
[1,] 13 17 21
[2,] 14 18 22
[3,] 15 19 23
[4,] 16 20 24
y[1, 3, 1]
[1] 9
Result!
배열 y의 1번째 행렬의 1번째 행 3번째 열의 원소가
선택되었다.
y[1, , 1]
[1] 1 5 9
Result!
배열 y의 1번째 행렬의 1번째 행의 원소들이
선택되었다.
y[, , 2]
[,1] [,2] [,3]
[1,] 13 17 21
[2,] 14 18 22
[3,] 15 19 23
[4,] 16 20 24
Result!
배열 y의 2번째 행렬의 원소들이 선택되었다.
data.frame()
를 이용하여 생성한다.
df <- data.frame(x = c(1, 3, 10), y = c("가"","나"나""다"))))
df
x y
1 1 가
2 3 나
3 10 다
df <- data.frame(x = c(1, 3), y = c("가"","나"나""다"다""라")"), = 6)6)
df
x y z
1 1 가 6
2 3 나 6
3 1 다 6
4 3 라 6
Caution!
데이터 프레임은 행렬과 같이 2차원 구조여서 함수
rownames()
와 colnames()
의 역할이 행렬과
동일하다. 하지만, 데이터 프레임에서는 함수 names()
가 함수
colnames()
와 같은 역할을 하고 있다.
Caution!
데이터 프레임은 함수 nrow()
,
ncol()
, dim()
으로 행렬의 행, 열, 차원을 확인할
수 있다.
Caution!
함수 str()
를 이용하여 데이터
프레임의 특성을 살펴볼 수 있다.
str(df)
'data.frame': 4 obs. of 3 variables:
$ one : num 1 3 1 3
$ two : Factor w/ 4 levels "가","나","다",..: 1 2 3 4
$ three: num 6 6 6 6
[행번호, 열번호]
로 원소를 선택할 수 있다.df <- data.frame(x = c(1, 3), y = c("가"","나"나""다"다""라")"), = 6)6)
df
x y z
1 1 가 6
2 3 나 6
3 1 다 6
4 3 라 6
df[2, 3]
[1] 6
Result!
데이터 프레임 df의 2번째 행 3번째 열 원소가
선택되었다.
df[, c(1,3)]
x z
1 1 6
2 3 6
3 1 6
4 3 6
Result!
데이터 프레임 df의 1번째, 3번째 열 원소들이
선택되었다.
df$y
[1] 가 나 다 라
Levels: 가 나 다 라
Caution!
데이터 프레임은 $
기호를 이용하여
원하는 이름의 열을 한꺼번에 선택할 수 있다.
Result!
데이터 프레임 df의 변수 “y” 원소들이
선택되었다.
df[x<2,]
x y z
1 1 가 6
Result!
데이터 프레임 df의 변수 “x” 값이 2보다 작은 행만
선택되었다.
list()
를 이용하여 생성한다.x <- list(a = c(1, 3, 10), b = c("가"","나"나""다"다""라")"), = data.frame(e(x= 1:9:9, x= 2:10)0), = list(1(13))))
x
$a
[1] 1 3 10
$b
[1] "가" "나" "다" "라"
$d
x1 x2
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
6 6 7
7 7 8
8 8 9
9 9 10
$e
$e[[1]]
[1] 1
$e[[2]]
[1] 3
x[3]
$d
x1 x2
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
6 6 7
7 7 8
8 8 9
9 9 10
class(x[3])
[1] "list"
Result!
리스트 x의 3번째 구성요소인 데이터 프레임으로
이루어진 리스트가 된다.
Result!
리스트 x의 3번째 구성요소인 데이터 프레임이
된다.
Caution!
리스트도 데이터 프레임과 같이 $
기호를 사용하여 인덱싱 할 수 있다.
x$b
[1] "가" "나" "다" "라"
x[["b"]]
[1] "가" "나" "다" "라"
class(x[["b"]])
[1] "character"
class(x$b)
[1] "character"
Result!
리스트 x$b는 x[[“b”]]와 동일한 결과를
출력한다.
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".