이 튜토리얼에서는 다음에 대하여 학습한다.
R 프로그래밍은 다음과 같은 다양한 데이터 타입을 처리한다:
기본 타입
TRUE 또는 FALSE : 논리(logical)라 불리는 불리안 값(Boolean value)이다." "나 ' '안에 있는 값 : 텍스트(문자열)이다. 이것들은 문자(characters)라 불린다.
우리는 class() 함수를 이용하여 변수의 타입을 확인할 수 있다.
예제 1:
xxxxxxxxxx# Declare variables of different types# Numericx <- 28class(x)
결과:
xxxxxxxxxx## [1] "numeric"
예제 2:
xxxxxxxxxx# Stringy <- "R is Fantastic"class(y)
결과:
xxxxxxxxxx## [1] "character"
예제 3:
xxxxxxxxxx# Booleanz <- TRUEclass(z)
결과:
xxxxxxxxxx## [1] "logical"
우리는 str() 함수를 이용하여 변수의 데이터 구조를 확인할 수 있다.
예제 4:
xxxxxxxxxx# Declare variables of different types# Numericx <- 28str(x)결과 :
xxxxxxxxxx## num 28
예제 5:
xxxxxxxxxx# Stringy <- "R is Fantastic"str(y)
결과:
xxxxxxxxxx## chr "R is Fantastic"
예제 6:
xxxxxxxxxx# Booleanz <- TRUEstr(z)
결과:
xxxxxxxxxx## logi TRUE
변수(variable)는 데이터를 저장하고 특히 데이터 과학자들에게는 중요한 구성요소이다. 하나의 변수는 하나의 숫자, 오브젝트, 통계 결과, 벡터, 데이터 세트, 그리고 기본적으로 R이 출력하는 모델 예측치 등을 저장할 수 있다. 우리는 단순히 변수명을 호출함으로써 나중에 그 변수를 사용할 수 있다.
변수를 선언하기 위해서는 '변수의 이름'을 지정해야 한다. 변수 이름은 공란이 있어서는 안된다. 단어를 연결하기 위해 _를 사용할 수 있다.
변수에 데이터를 저장하기 위해 <- 또는 =를 사용한다.
여기에 사용방법이 있다:
xxxxxxxxxx# First way to declare a variable: use the `<-`name_of_variable <- value# Second way to declare a variable: use the `=`name_of_variable = value
command 라인에서 우리는 다음과 같이 어떠한 일이 벌어지는지 알아보기 위해 다음의 코드를 작성할 수 있다:
예제 1:
xxxxxxxxxx# Print variable xx <- 42x
결과:
xxxxxxxxxx## [1] 42
예제 2:
xxxxxxxxxxy <- 10y
결과:
xxxxxxxxxx## [1] 10
예제 3:
xxxxxxxxxx# We call x and y and apply a subtractionx-y
결과:
xxxxxxxxxx## [1] 32
벡터(vector)는 일차원 배열(array)이다. 우리는 앞에서 배운 모든 기본 데이터를 이용하여 벡터를 생성할 수 있다.
R에서 벡서를 만드는 가장 간단한 방법은 c( ) 함수(c : combine)를 사용하는 것이다.
참고 : 벡터(vector)와 리스트(list)의 공통적인 특성
- 유형 :
typeof(), 어떤 유형인가?- 길이 :
length(), 얼마나 많은 요소를 갖고 있는가?- 속성 :
attributes(), 임의의 추가적 메타 데이터는 무엇인가?
예제 1: (정수형)
xxxxxxxxxx# Numericalvec_num <- c(1, 10, 49)vec_num
결과:
xxxxxxxxxx## [1] 1 10 49
예제 2:(문자형)
xxxxxxxxxx# Charactervec_chr <- c("a", "b", "c")vec_chr
결과:
xxxxxxxxxx## [1] "a" "b" "c"
예제 3: (논리형)
xxxxxxxxxx# Booleanvec_bool <- c(TRUE, FALSE, TRUE)vec_bool
결과:
xxxxxxxxxx## [1] TRUE FALSE TRUE
예제 4: (더블 형*)
xxxxxxxxxx# Doubledbl_var <- c(1, 2.5, 4.5)dbl_var
결과:
xxxxxxxxxx## [1] 1.0 2.5 4.5
변수 값의 출력 방법
[방법 1] 변수명을 기입하는 방법
xxxxxxxxxx# Numericalvec_num <- c(1, 10, 49)vec_num
[방법 2]
;을 이용하여 같은 줄에 변수명을 기입하는 방법xxxxxxxxxx# Numerical :vec_num <- c(1, 10, 49); vec_num
[방법 3]
()를 이용하는 방법xxxxxxxxxx# Numerical( vec_num <- c(1, 10, 49) )
예제 5:
xxxxxxxxxxc(1, c(2, c(3,4))) # c(1, 2, 3, 4)와 같음결과:
xxxxxxxxxx## [1] 1 2 3 4
typeof() 함수로 그 벡터의 유형을 지정할 수 있다.
is 함수를 사용하여 그 벡터가 어떤 유형인지 검증할 수 있다.
예제 6:
xxxxxxxxxxvec_num <- c(1, 10, 49)vec_numtypeof(vec_num)is.integer(vec_num)is.atomic(vec_num)결과:
xxxxxxxxxx> vec_num## [1] 1 10 49> typeof(vec_num)## [1] "double"> is.integer(vec_num)## [1] FALSE> is.atomic(vec_num)## [1] TRUE> is.atomic(vec_num)## [1] TRUE
벡터의 모든 요소는 같은 유형을 가져야 한다. 따라서 서로 다른 유형을 결합하려고 할 때 그 요소를 가장 유연한 유형으로 강제형변환(coersion)된다.
( 유연성 정도의 순서) 문자형 > 더블형 > 정수형 > 논리형
예제 7: 문자형과 숫자형의 결합
xxxxxxxxxxstr(c("a", 1))결과: 숫자형이 문자형으로 강제변환된다.
xxxxxxxxxx## chr [1:2] "a" "1"
다음의 함수를 이용하여 명시적으로 데이터의 형변환을 할 수 있다.
예제 8: as.numeric()
xxxxxxxxxxx <- c(FALSE, FALSE, TRUE)as.numeric(x)결과 :
xxxxxxxxxx[1] 0 0 1
먼저 R에서 사용되는 기본적인 산술 연산자를 살펴볼 것이다.
| 연산자 | 설명 |
|---|---|
+ | 덧셈(Addition) |
- | 뺄셈(Subtraction) |
* | 곱셈(Multiplication) |
/ | 나눗셈(Division) |
^ or ** | 제곱(Exponentiation) |
%% | 나머지(Modulo) |
%/% | 몫(Quotient) |
우리는 벡터의 산술 연산을 수행할 수 있다.
예제 1:
xxxxxxxxxx# Create the vectorsvect_1 <- c(1, 3, 5)vect_2 <- c(2, 4, 6)# Take the sum of A_vector and B_vectorsum_vect <- vect_1 + vect_2# Print out total_vectorsum_vect
결과:
xxxxxxxxxx## [1] 3 7 11
예제 2:
xxxxxxxxxx# An addition3 + 4
결과:
xxxxxxxxxx## [1] 7
여러분은 R 코드를 Rstudio Console에 쉽게 복사해서 붙여 넣기할 수 있다. 결과는 # 기호 다음에 표시가 된다. 예 들어, print('Guru99')라고 코드를 작성하면 결과는 ## [1] Guru99가 될 것이다.
## 는 결과를 프린트하는 것을 그리고 대괄호([ ]) 안의 숫자는 출력물의 갯수를 의미한다.
# 로 시작하는 문장은 주석(annotation)이다. R 스크립트 내에 우리가 원하는 주석(설명)을 추가하기 위해 #를 사용할 수 있다. R은 실행하는 동안 그 이하의 문장을 읽지 않을 것이다.
예제 3:
xxxxxxxxxx# A multiplication3*5
결과:
xxxxxxxxxx## [1] 15
예제 4:
xxxxxxxxxx# A division(5+5)/2
결과:
xxxxxxxxxx## [1] 5
예제 5:
xxxxxxxxxx# Exponentiation2^5# or2**5
결과:
xxxxxxxxxx## [1] 32
예제 6:
xxxxxxxxxx# Modulo : %% (나머지)27%%6
결과:
xxxxxxxxxx## [1] 3
예제 7:
xxxxxxxxxx# Quotient : %/% (몫)27%/%6
결과:
xxxxxxxxxx## [1] 4
논리 연산자를 가지고 논리 조건식에 기반하여 벡터 내의 값들을 반환하고자 한다. 다음은 R에서 사용할 수 있는 논리 연산자의 상세 목록이다.
| 연산자 | 설명 |
|---|---|
< | 작다 |
<= | 작거나 같다 |
> | 크다 |
>= | 크거나 같다 |
== | 같다 |
!= | 다르다 |
!x | not x |
x | x |
x|y | 논리합 (or) |
x&y | 논리곱 (and) |
isTRUE(x) | x가 TRUE인가? |
R에서의 논리문은 대괄호([ ]) 안에 둘러 싸여 있다. 우리가 원하는 만큼의 조건 문장을 추가할 수 있지만 그 조건들을 괄호(())안에 포함시켜야 한다. 우리는 조건문을 생성하기 위해 다음의 구조를 따를 수 있다:
xxxxxxxxxxvariable_name[(conditional_statement)]
변수(variable)를 참조하는 변수명(variable_name)을 가지고 우리는 문장에 사용하고자 한다. 우리는 variable_name > 0 같은 논리 문장을 생성한다. 끝으로, 논리문을 종료하기 위해 대괄호([ ])를 사용한다. 아래에 논리문의 예가 있다.
예제 1:
xxxxxxxxxx# Create a vector from 1 to 10logical_vector <- 1:10# logical statementlogical_vector > 5
결과:
xxxxxxxxxx## [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
위의 결과에서 R은 벡터 내의 각각의 요소를 읽고 그것을 logical_vector > 5와 비교한다. 만일 벡터의 원소 값이 5보다 크면 조건은 TRUE이고, 그렇지 않으면 FALSE이다. 즉 R은 TRUE와 FALSE로 구성된 벡터를 출력한다.
예제 2:
아래의 예에서 우리는 '5보다 큰' 조건을 만족하는 값들만을 추출하고자 한다. 이를 위해, 우리는 값을 포함하는 벡터 다음의 대괄호 안에 조건을 삽입할 수 있다.
xxxxxxxxxx# Print value strictly above 5logical_vector[(logical_vector>5)]
결과:
xxxxxxxxxx## [1] 6 7 8 9 10
예제 3:
xxxxxxxxxx# Print 5 and 6logical_vector <- 1:10logical_vector[(logical_vector>4) & (logical_vector<7)]
결과:
xxxxxxxxxx## [1] 5 6
예제 1: [Subsetting]
R에서는 벡터를 잘라낼 수 있다. 어떤 경우에는 벡터의 첫 다섯 행만 관심이 있을 수 있다. 그런 경우 1에서 5까지의 값을 추출하기 위해 우리는 [1:5] 명령을 사용할 수 있다.
xxxxxxxxxx# Slice the first five rows of the vectorslice_vector <- c(1,2,3,4,5,6,7,8,9,10)slice_vector[1:5]
결과:
xxxxxxxxxx## [1] 1 2 3 4 5
예제 2: which() 함수의 이용
xxxxxxxxxxslice_vector <- c(1,2,3,4,5,6,7,8,9,10)slice_vector[which(slice_vector %% 3 == 0)] # 3의 배수만 출력결과:
xxxxxxxxxx## [1] 3 6 9
예제 3: 값의 범위 생성
값의 범위를 생성하는 가장 간단한 방법은 두 개의 수 사이에 :를 사용하는 것이다. 예를 들어, 위의 예에서와 같이 우리는 1부터 10까지의 숫자 벡터를 생성하기 위해 c(1:10) 또는 1:10이라고 작성할 수 있다.
xxxxxxxxxx# Faster way to create adjacent valuesc(1:10)# or1:10# orseq(1,10)
결과:
xxxxxxxxxx## [1] 1 2 3 4 5 6 7 8 9 10
예제 4: seq() 함수의 이용 예
xxxxxxxxxxseq(0, 1, length.out = 11)seq(stats::rnorm(20)) # effectively 'along'seq(1, 9, by = 2) # matches 'end'seq(1, 9, by = pi) # stays below 'end'seq(1, 6, by = 3)seq(1.575, 5.125, by = 0.05)seq(17) # same as 1:17, or even better seq_len(17)
결과:
xxxxxxxxxx> seq(0, 1, length.out = 11)## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0> seq(stats::rnorm(20)) # effectively 'along'## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20> seq(1, 9, by = 2) # matches 'end'## [1] 1 3 5 7 9> seq(1, 9, by = pi) # stays below 'end'## [1] 1.000000 4.141593 7.283185> seq(1, 6, by = 3)## [1] 1 4> seq(1.575, 5.125, by = 0.05)## [1] 1.575 1.625 1.675 1.725 1.775 1.825 1.875 1.925 1.975 2.025 2.075 2.125## [13] 2.175 2.225 2.275 2.325 2.375 2.425 2.475 2.525 2.575 2.625 2.675 2.725## [25] 2.775 2.825 2.875 2.925 2.975 3.025 3.075 3.125 3.175 3.225 3.275 3.325## [37] 3.375 3.425 3.475 3.525 3.575 3.625 3.675 3.725 3.775 3.825 3.875 3.925## [49] 3.975 4.025 4.075 4.125 4.175 4.225 4.275 4.325 4.375 4.425 4.475 4.525## [61] 4.575 4.625 4.675 4.725 4.775 4.825 4.875 4.925 4.975 5.025 5.075 5.125> seq(17) # same as 1:17, or even better seq_len(17)## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
예제 5: 반복적 요소 생성
xxxxxxxxxxrep(1, 5)결과:
xxxxxxxxxx## [1] 1 1 1 1 1
예제 6: rep() 함수의 이용
xxxxxxxxxxrep(1:4, 2)rep(1:4, each = 2) # not the same.rep(1:4, c(2,2,2,2)) # same as second.rep(1:4, c(2,1,2,1))rep(1:4, each = 2, len = 4) # first 4 only.rep(1:4, each = 2, len = 10) # 8 integers plus two recycled 1's.rep(1:4, each = 2, times = 3) # length 24, 3 complete replicationsrep(1, 40*(1-.8)) # length 7 on most platformsrep(1, 40*(1-.8)+1e-7) # bette
결과:
xxxxxxxxxx> rep(1:4, 2)## [1] 1 2 3 4 1 2 3 4> rep(1:4, each = 2) # not the same.## [1] 1 1 2 2 3 3 4 4> rep(1:4, c(2,2,2,2)) # same as second.## [1] 1 1 2 2 3 3 4 4> rep(1:4, c(2,1,2,1))## [1] 1 1 2 3 3 4> rep(1:4, each = 2, len = 4) # first 4 only.## [1] 1 1 2 2> rep(1:4, each = 2, len = 10) # 8 integers plus two recycled 1's.## [1] 1 1 2 2 3 3 4 4 1 1> rep(1:4, each = 2, times = 3) # length 24, 3 complete replications## [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4>> rep(1, 40*(1-.8)) # length 7 on most platforms## [1] 1 1 1 1 1 1 1> rep(1, 40*(1-.8)+1e-7) # better## [1] 1 1 1 1 1 1 1 1
방법 1> 벡터를 생성할 때
xxxxxxxxxxx <- c(a=1, b=2, c=3) ; x결과 :
xxxxxxxxxx## a b c## 1 2 3
방법 2> 작업공간에 생성되어 있는 벡터 x 요소에 이름을 붙일 때 : names() 함수 이용
xxxxxxxxxxx <- c(1, 2, 3); xnames(x) <- c("a", "b", "c") ; x결과 :
xxxxxxxxxx> x <- c(1, 2, 3); x## [1] 1 2 3> names(x) <- c("a", "b", "c") ; x## a b c ## 1 2 3
방법 3> 벡터의 수정된 사본을 생성할 때 : setNames() 함수 이용
xxxxxxxxxxx <- setNames(1:3, c("a", "b", "c"))결과:
xxxxxxxxxx## a b c ## 1 2 3
length() 함수 이용
예제 7:
xxxxxxxxxxx <- c(1, 2, 3)length(x)결과:
xxxxxxxxxx## [1] 3