R에 들어가기에 앞서..

R 소프트웨어는 통계 처리를 목적으로 만들어진 오픈 소스 프로그램이다. 기존의 상용화된 통계 프로그램인 ‘S’ 보다 가격면 뿐만 아닌 성능면에서 능가하는 프로그램이 되길 기원하는 마음으로 알파벳 순서가 한글자 앞인 ’R’이라고 명명했다. R을 사용하기에 앞서 R core와 R studio가 설치되어야한다.

R studio는 보다 편하게 R를 쓸 수 있게 해주는 GUI 프로그램이다.

R core와 Rstudio 설치하기

R core 설치

해당 OS에 해당하는 인스톨 파일 다운로드

Rstudio 다운로드 페이지

Rstudio 다운로드 페이지

Rstudio 설치

R cran 웹페이지에서 해당 OS에 해당하는 인스톨 파일 다운로드

Rstudio 다운로드 페이지

Rstudio 다운로드 페이지

텍스트 에디터 notepad++ 설치하기

맥이면, Sublime Text 추천

notepad++ 다운로드 페이지

notepad++ 다운로드 페이지

Rstudio를 실행하면 다음과 같은 화면이 나옴.

Rstudio 실행화면

Rstudio 실행화면

문법

기본 문법

RStudio 프로그램을 이용하여 R의 기본적인 문법과 데이터의 유형을 학습한다. R에서는 콘솔(console)에도 명령어를 입력하여 실행할 수 있지만 가능하면 스크립트 (script)를 이용하여 명령어를 실행하고 저장하는 것이 좋다. 여기서는 RStudio에서 제공하는 스크립트를 기준으로 설명한다.

  • #

    주석(comment)의 기능으로 프로그램 전반적인 내용, 명령어의 내용 등이 무엇을 의미하는지 알 수 있도록 사용자가 설명을 달아주는 기능이다. # 뒤에 있는 한 줄이 주석으로 처리되며 R에서 지정된 문법을 검사하지 않는다. 단 한 줄만 주석으로 처리되므로 다른 줄도 하고 싶으면 해당 줄 앞에 #를 써 주어야 한다.

  • ;

    세미콜론은 하나의 명령어가 끝났음을 알려주는 기능이다. 하지만 한 줄에 하나의 명령밖에 없으면 세미콜론을 해 주지 않아도 명령어가 끝났음을 인식한다.

  • Enter

    다음 줄로 이동할 때 사용한다.

  • Ctrl + Enter

    R의 명령어를 실행하는 기능이다. 명령어가 한 줄인 경우는 마우스의 위치는 해당 줄의 아무 곳에 있어도 상관이 없다. 명령어가 두 줄 이상인 경우에는 반드시 해당 명령어가 있는 곳을 블록잡고 실행시켜야 한다.

  • Shift + Enter

    함수를 사용할 때에 함수에 들어가는 값을 argument라고 한다. 함수 안에 들어가는 argument가 많아지면 하나의 명령어가 길게 표현된다. 그러면 명령어를 이해하는 데에 불편함이 있다. Shift + Enter를 하면 동일한 위치에 다른 argument를 올 수 있도록 해 준다.

  • 대소문자

    R은 대소문자를 구별한다. 이것은 “case sensitive하다” 라고 표현한다. 소문자 x와 대문자 X는 전혀 다른 것을 의미하기 때문에 주의하기 바란다.

  • 산술연산자 (+, -, *, /, …)

기호 의미
+ 더하기
- 빼기
* 곱하기
/ 나누기
** 거듭제곱
^ 거듭제곱
%/%
%% 나머지
  • 비교 연산자(Relational Operator)
연산자 설명 입력내용 결과 내용
> 크다 3 > 4 FALSE
>= 크거나 같다 3 >= 4 TRUE
< 작다 3 < 4 TRUE
<= 작거나 같다 3 <= 4 TRUE
== 같다 3 == 4 FALSE
!= 같지 않다 3 != 4 TRUE
! 아니다 !(3 == 4) TRUE
  • 할당 연산자(allocation operator)
연산자 설명 입력내용
<- 오른쪽의 값을 왼쪽의 이름에 저장함 x <- 3
= ’’ y = 4
-> 왼쪽의 값을 오른쪽의 이름에 저장함 5 -> z
  • 논리 연산자(logical operator)
연산자 설명 입력내용 결과 내용
& 또는 && AND (조건1) & (조건2)
| 또는 || OR (조건1) | (조건2)
! NOT !(조건)
  • 수학함수 (sin, cos, tan, …), 지수/로그(^, log, log10) 등등 숫자형 변수간의 수학연산이 가능하다
함수명 설명 입력내용 결과 내용
abs() 절대값 abs(-3) 3
sqrt() 제곱근 sqrt(16) 4
pi 원주율 pi 3.141593
sign() 부호 sign(-3) -1
round() 반올림 round(2.345, digits=2) 2.35
ceiling() 무조건 올림 ceiling(2.3) 3
floor() 무조건 내림 floor(2.7) 2
exp() 지수 exp(10) 22026.47
log() 자연로그 log(10) 2.302585
log10() 사용로그 log10(10) 1
log2() 로그(2) log2(10) 3.321928
logb() 일반화 로그 logb(10, base=3) 2.095903
factorial() 계승 factorial(4) 24
choose() 조합 choose(4, 2) 6
prod() prod(1:4) 24
sin() 사인(sine) sin(0.5) 0.4794255
cos() 코사인(cosine) cos(0.5) 0.8775826
tan() 탄젠트(tangent) tan(0.5) 0.5463025

데이터 유형

  • 수치형(numeric): 숫자로 되어 있으며, 정수형(integer)과 실수형(double)이 있다.
  • 문자형(character): 하나의 문자 또는 문자열로 되어 있으며, “” 또는 ’’로 묶여 있다.
  • 논리형(logical): 참과 거짓의 논리값으로 TRUE(or T)이나 FALSE(or F)를 가진다.
  • 복소수형(complex): 실수와 허수로 이루어진 복소수이다
  • NULL: 객체(object)로서 존재하지 않는 객체로 지정할 때 사용함.
  • NA: Not Available의 약자로 결측치(missing value)를 의미함
  • NaN: Not available Number의 약자로 수학적으로 계산이 불가능한 수를 의미한다. 예를 들면 sqrt(-3)로 음수에 대한 제곱근은 구할 수 없다.
  • Inf: Infinite의 양자로 양의 무한대이다.
  • -Inf: 음의 무한대이다.
  • 데이터의 유형을 알려주는 함수: mode() 혹은 is.~ 함수
x1 = 3; x2 = "NIER"; x3 = FALSE; x4 = 3-2i
mode(x1); mode(x2); mode(x3); mode(x4)
## [1] "numeric"
## [1] "character"
## [1] "logical"
## [1] "complex"
함수명 설명 입력내용 결과 내용
is.numeric() 수치형 여부 is.numeric(데이터) TRUE or FALSE
is.integer() 정수형 여부 is.integer(데이터) TRUE or FALSE
is.double() 실수형 여부 is.double(데이터) TRUE or FALSE
is.character() 문자형 여부 is.character(데이터) TRUE or FALSE
is.logical() 논리형 여부 is.logical(데이터) TRUE or FALSE
is.complex() 복소수형 여부 is.complex(데이터) TRUE or FALSE
is.null() NULL 여부 is.null(데이터) TRUE or FALSE
is.na() NA 여부 is.na(데이터) TRUE or FALSE
is.finite() 유한 수치 여부 is.finite(데이터) TRUE or FALSE
is.infinite() 무한 수치 여부 is.infinite(데이터) TRUE or FALSE
  • 데이터의 유형의 우선순위: 문자형(character) > 복소수형(complex) > 수치형(numeric) > 논리형(logical)
x2 = c(x1, x2, x3, x4)
x2
## [1] "3"     "NIER"  "FALSE" "3-2i"
  • 데이터의 유형을 강제적으로 변경하는 함수
함수명 설명 입력내용 결과 내용
as.numeric() 수치형으로 변환 as.numeric(데이터) 변환되거나 NA
as.integer() 정수형으로 변환 as.integer(데이터) 변환되거나 NA
as.double() 실수형으로 변환 as.double(데이터) 변환되거나 NA
as.character() 문자형으로 변환 as.character(데이터) 변환되거나 NA
as.logical() 논리형으로 변환 as.logical(데이터) 변환되거나 NA
as.complex() 복소수형으로 변환 as.complex(데이터) 변환되거나 NA

데이터 형태

벡터(vector): 스칼라의 확장으로 한 개 이상의 데이터를 갖는다

벡터의 생성
  • c() : combine 또는 concatenate. 기본적으로는 스칼라가 들어가며, 스칼라와 스칼라 사이는 콤마로 구분한다. 또한 벡터도 들어갈 수 있다
v1 = c(3, 10, 12)
v2 = c("Kim", "Lee", "Park")
v3 = c(TRUE, FALSE, FALSE, FALSE)
v4 = c(v1, v2, v3)
v1; v2; v3; v4
## [1]  3 10 12
## [1] "Kim"  "Lee"  "Park"
## [1]  TRUE FALSE FALSE FALSE
##  [1] "3"     "10"    "12"    "Kim"   "Lee"   "Park"  "TRUE"  "FALSE" "FALSE"
## [10] "FALSE"
  • : : 수치형에만 적용되며, 1씩 증가되거나 1씩 감소되는 규칙이 있는 벡터를 생성. start:end 구조로 사용하며, start, end는 숫자이고, start > end이면 1씩 감소되고, start < end이면 1씩 증가되며, start=end 이면 start 또는 end가 된다. 시작은 무조건 start에서 시작해서 end를 넘지 않는다
(v1 = 1:5)
## [1] 1 2 3 4 5
(v2 = 5:1)
## [1] 5 4 3 2 1
(v3 = -3.3:5)
## [1] -3.3 -2.3 -1.3 -0.3  0.7  1.7  2.7  3.7  4.7
(v4 = 5:-3.3)
## [1]  5  4  3  2  1  0 -1 -2 -3
  • seq() : sequence의 약자, 1 이외의 증감이 되는 규칙 있는 수치형 벡터를 생성
argument 설명
from 시작값
to 끝값
by 얼마씩 증가 또는 감소시킬지를 정하는 단계값. 단, 감소시킬 경우에는 부호가 음수이어야 한다. 그렇지 않으면 에러(error)가 발생.
(v1 = seq(from = 1, to = 5, by = 1))
## [1] 1 2 3 4 5
(v2 = seq(from = 1, to = 5, by = 0.5))
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
(v3 = seq(from = 5, to = 1, by = -0.5))
## [1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0
(v4 = seq(5, 1, -0.5))
## [1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0
벡터의 속성
  • 데이터의 유형: mode(), is.numeric(), is.character(), is.logical(),
mode(v1)
## [1] "numeric"
is.character(v1)
## [1] FALSE
is.numeric(v1)
## [1] TRUE
  • 데이터의 이름: names(벡터)
names(v1) = c("A", "B", "C", "D", "E")
v1
## A B C D E 
## 1 2 3 4 5
  • 데이터의 추출: 대괄호([])를 사용. 양의 정수는 색인(index)으로 벡터가 가지는 데이터의 위치를 의미
weight = c(57, 81, 65, 49, 72)
weight[1]
## [1] 57
weight[2]
## [1] 81
weight[2:4]
## [1] 81 65 49
weight[c(1, 4, 5)]
## [1] 57 49 72
weight[-c(1, 4, 5)]
## [1] 81 65
벡터의 연산
  • 벡터의 길이가 동일한 경우: 연산에 사용되는 벡터들의 길이가 동일한 경우로서 벡터들 간의 사칙연산을 할 수 있고, 최종적인 결과는 벡터가 된다. 벡터들 간의 연산이 될 때에는 각 벡터에 있는 동일한 위치의 값들 간이 연산이 된다. 예를 들어, 수치형 벡터인 v1과 v2가 있고 v1 + v2의 연산을 하면, v1[1] + v2[1]의 연산이 된다.
v1 = 1:3
v2 = 4:6
v1 + v2
## [1] 5 7 9
v1 - v2
## [1] -3 -3 -3
v1 * v2
## [1]  4 10 18
v1 / v2
## [1] 0.25 0.40 0.50
v1 ** v2
## [1]   1  32 729
  • 벡터의 길이가 동일하지 않은 경우: 연산과정에서 데이터의 개수가 적은 쪽의 벡터는 데이터 개수가 많은 쪽의 벡터와 동일하게 데이터의 개수를 맞춘다.
v1 = 1:3
v2 = 1:6
v1 + v2 
## [1] 2 4 6 5 7 9
v2 = 1:10
v1 + v2
## Warning in v1 + v2: longer object length is not a multiple of shorter object
## length
##  [1]  2  4  6  5  7  9  8 10 12 11

요인(factor)

  • 데이터를 질적 자료(또는 범주형 자료)로 변환. 질적자료로 변경되면 집단별로 통계분석을 할 수 있다. factor() 함수를 사용하며, 그 사용 방법은 다음과 같다
argument 설명
x 벡터를 지정한다.
levels 그룹으로 지정할 문자형 벡터를 지정하며, levels를 쓰지 않으면 오름차순으로 구분하여 자체적으로 그룹을 지정한다.
labels levels에 대한 문자형 벡터를 지정한다.
ordered levels에 대해 특정한 순서를 정하고 싶으면 TRUE를 지정한다.
bt = c("A", "O", "A", "AB", "O", "B")
bt
## [1] "A"  "O"  "A"  "AB" "O"  "B"
bt_factor = factor(bt)
bt_factor
## [1] A  O  A  AB O  B 
## Levels: A AB B O
levels(bt_factor)
## [1] "A"  "AB" "B"  "O"
levels(bt_factor) = c("A형", "AB형", "B형", "O형")
bt_factor
## [1] A형  O형  A형  AB형 O형  B형 
## Levels: A형 AB형 B형 O형

리스트

  • 주로 통계분석의 결과를 저장할 때 사용하는 데이터 형태이며, 리스트의 원소로 스칼라, 벡터, 행렬, 배열, 데이터 프레임, 요인 그리고 리스트 자신을 가질 수 있다.
s1 = 10
v1 = 1:10
m1 = matrix(1:4, nrow = 2, ncol = 2)
a1 = array(1:8, dim = c(2, 2, 2))
df1 = data.frame(id = 1:3, age = c(20, 30, 40))
f1 = factor(c("A", "O", "A", "AB", "O", "B"))
result = list(s1, v1, m1, a1, df1, f1)
result
## [[1]]
## [1] 10
## 
## [[2]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[3]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## [[4]]
## , , 1
## 
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## , , 2
## 
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8
## 
## 
## [[5]]
##   id age
## 1  1  20
## 2  2  30
## 3  3  40
## 
## [[6]]
## [1] A  O  A  AB O  B 
## Levels: A AB B O
  • 리스트(list)의 원소를 추출하는 방법
    • 대괄호([index]) 하나를 쓰는 것: 대괄호를 하나를 쓰면 최종적인 결과가 리스트가 되며,
    • 대괄호를 두 개([[index]]: 대괄호를 두 개를 쓰면 최종적인 결과가 해당 원소의 데이터 형태가 된다
result[2]
## [[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
result[[2]]
##  [1]  1  2  3  4  5  6  7  8  9 10
  • 데이터 프레임(Data Frame)
  • 데이터 프레임은 R에서 가장 중요한 자료형이다. 데이터 프레임은 행렬과 마찬가지의 모습을 하고 있지만 행렬과 달리 다양한 변수, 관측치(observations), 범주 등을 표현하기 위해 특화되어있다.

data.frame() 사용

dat = data.frame ( x = c (1 , 2 , 3 , 4 , 5) , y = c (2 , 4 , 6 , 8 , 10) )
dat
##   x  y
## 1 1  2
## 2 2  4
## 3 3  6
## 4 4  8
## 5 5 10
dat = data.frame ( x = c (1 , 2 , 3 , 4 , 5) ,
                  y = c (2 , 4 , 6 , 8 , 10) ,
                  z = c ('M', 'F', 'M', 'F', 'M') ) # Factor 형태의 z 열이 추가된 예

dat
##   x  y z
## 1 1  2 M
## 2 2  4 F
## 3 3  6 M
## 4 4  8 F
## 5 5 10 M
dat$v = c (3 , 6 , 9 , 12 , 15)
dat
##   x  y z  v
## 1 1  2 M  3
## 2 2  4 F  6
## 3 3  6 M  9
## 4 4  8 F 12
## 5 5 10 M 15

데이터 프레임 접근

  • 데이터 프레임의 각 열은 ’$변수명’으로 접근할 수 있으며, 행이나 열의 인덱스를 사용해서도 데이터에 접근할 수 있다.
dat$x
## [1] 1 2 3 4 5
dat$y
## [1]  2  4  6  8 10
dat$z
## [1] "M" "F" "M" "F" "M"
dat$v
## [1]  3  6  9 12 15
dat[1,2]
## [1] 2
dat[c(1,3),2]
## [1] 2 6
dat[-1,-c(2,3)] # 벡터로 인덱스를 지정하거나, 또는 제외할 행 또는 열을 - 로 표시할 수 있다.
##   x  v
## 2 2  6
## 3 3  9
## 4 4 12
## 5 5 15
dat[,c("x","y")] # 또는 컬럼명을 지정할 수도 있다.
##   x  y
## 1 1  2
## 2 2  4
## 3 3  6
## 4 4  8
## 5 5 10
  • str()과 head()를 사용하여 간략하게 살펴볼 수 있다.
  • str() 함수는 R 객체의 내부 구조 (데이터 유형)를 보는데 사용
  • head() 함수는 R 객체의 상부 일부분을 보여줌
  • tail() 함수는 R 객체의 하부 일부분을 보여줌
str(dat)
## 'data.frame':    5 obs. of  4 variables:
##  $ x: num  1 2 3 4 5
##  $ y: num  2 4 6 8 10
##  $ z: chr  "M" "F" "M" "F" ...
##  $ v: num  3 6 9 12 15
head(dat)
##   x  y z  v
## 1 1  2 M  3
## 2 2  4 F  6
## 3 3  6 M  9
## 4 4  8 F 12
## 5 5 10 M 15
head(dat, n = 3)
##   x y z v
## 1 1 2 M 3
## 2 2 4 F 6
## 3 3 6 M 9
tail(dat)
##   x  y z  v
## 1 1  2 M  3
## 2 2  4 F  6
## 3 3  6 M  9
## 4 4  8 F 12
## 5 5 10 M 15
tail(dat, n = 3)
##   x  y z  v
## 3 3  6 M  9
## 4 4  8 F 12
## 5 5 10 M 15
  • 데이터 프레임의 행 이름, 열 이름은 각각 rownames(), colnames() 함수로 지정할 수 있다.
  • head(데이터명), tail(데이터명)
rownames(dat)
## [1] "1" "2" "3" "4" "5"
rownames(dat) = c("a", "b", "c", "d", "e")
colnames(dat)
## [1] "x" "y" "z" "v"
colnames(dat) = c("ab", "bc", "cd", "da")
  • 주어진 값이 벡터에 존재하는지를 판별하는 %in% 연산자를 이용하면 특정 열만 선택하는 작업을 보다 손쉽게 할 수 있다. 예를들어 다음과 같이 a, b, c 열이 있는 데이터 프레임에서 b, c 열만 선택하는 경우를 보자.
dat[,colnames(dat) %in% c("ab")]
## [1] 1 2 3 4 5
  • 반대로 ! 연산자를 사용해 특정 값들만 제외해서 열을 선택할 수도 있다.
dat[,!colnames(dat) %in% c("ab")]
##   bc cd da
## a  2  M  3
## b  4  F  6
## c  6  M  9
## d  8  F 12
## e 10  M 15
  • grep: 변수명 중에서 특정 문자로 시작하거나 끝나거나 포함하고 있는 것을 추출할 때
argument 설명
pattern 특정한 문자로 시작하거나 끝나거나 포함하고 있는지를 문자형으로 표현한다. a로 시작하는 것은 “^a”, a로 끝나는 것은 “a$”, a를 포함하는 것은 “a”로 지정한다.x 문자형 벡터를 지정한다.
value 논리형으로 TRUE으로 pattern를 만족하는 벡터의 값을 반환하고,FALSE를 지정하면 pattern를 만족하는 벡터의 위치(index)를 반환한다.
grep("a", colnames(dat), value = TRUE) # 헤더이름 중 O가 들어가는 이름
## [1] "ab" "da"
grep("a", colnames(dat), value = FALSE) # 헤더이름 중 O가 들어가는 순서 
## [1] 1 4
dat[, grep("a", colnames(dat), value = TRUE)] # 헤더이름 중 O가 들어가는 이름 중 10열까지 출력
##   ab da
## a  1  3
## b  2  6
## c  3  9
## d  4 12
## e  5 15
  • substr: 문자 중에서 일부를 추출. 엑셀의 mid 함수와 동일
argument 설명
x 문자형 벡터를 지정한다.
start 추출할 문자의 첫 번째 위치를 정수형으로 지정.
stop 추출한 문자의 마지막 위치를 정수형으로 지정.
substr(colnames(dat), start = 1, stop = 1) # 변수명 중에서 처음 두 개의 문자를 추출
## [1] "a" "b" "c" "d"
substr(colnames(dat), 1, 1) # 변수명 중에서 처음 두 개의 문자를 추출
## [1] "a" "b" "c" "d"
dat[, substr(colnames(dat), start = 1, stop = 1) == "b"] # 변수명 중에서 처음 1개의 문자를 추출한 것이 “a”와같은 열을 추출
## [1]  2  4  6  8 10

원하는 케이스의 행 추출

엑셀의 필터링 기능
  • dat 데이터에서 배출원 셩별을 나타내는 ‘cd’ 변수가 있다. 각각을 추출하여 ‘male’, ’female’이라는 데이터셋으로 할당
male = dat[dat$cd == "M" , ] 
female = dat[dat$cd == "F" , ]
  • factor를 이용하면 그룹에 따른 boxplot을 그릴 수 있다.
boxplot(dat$ab ~ dat$cd) #factor를 이용한 boxplot

* 이와 마찬가지로 원하는 조건에 따라 추출 가능

dat[dat$ab >= 5, ] # Organic이 5 ug m-3 이상인 자료
dat[(dat$cd == 'u') & (dat$bc >= 4), ] # Organic이 5 ug m-3 이상이고 풍상지역인 자료
dat[(dat$cd == 'u') | (dat$bc >= 4), ] # Organic이 5 ug m-3 이상이거나 풍상지역인 자료
dat[(dat$cd == 'u') | (dat$bc >= 4), 2:3] # Organic이 5 ug m-3 이상이거나 풍상지역인 자료 중 2번째, 3번째 컬럼
dat[(dat$cd == 'u') | (dat$bc >= 4), c("ab", "da")] # Organic이 5 ug m-3 이상이거나 풍상지역인 자료 중 "ORG", "SO4" 컬럼

조건

R의 기본적인 제어문, 연산, 함수는 기본적으로 다른 언어와 유사하지만 저장된 데이터를 한번에 다루는 벡터연산을 수행한다는 점이 차별화임

if: if (조건) 참일 때 표현

x = 5
if (x > 0) "Positive number"
## [1] "Positive number"

if else: if(조건) 참일 때 표현 else 거짓일 때 표현

x = - 5
if (x > 0) "Positive number" else "Negative number"
## [1] "Negative number"
  • 더 단순하게 아래 처럼 ifelse 함수로 표현도 가능함.
x = - 5
ifelse (x > 0, "Positive number", "Negative number")
## [1] "Negative number"
  • 표현이 한 줄로 정리되지 않을 시, 아래와 같이 중괄호 { }에 묶어서 사용할 수 있음.
x = - 5
if (x > 0){
  "Positive number"
  } else {
    "Negative number"
}
## [1] "Negative number"
  • 조건이 두개 이상일 시는 else if 함수로 추가 가능함.
x = 0
if (x > 0){
  "Positive number"
  } else if (x == 0) {
    "zero"
  } else {
    "Negative number"
  }
## [1] "zero"

반복문

for: for (반복할 변수명 in 반복할 내용) 표현

for (i in 1:5) print(1:i) # i를 1에서 5까지 반복하면서 1부터 1씩 증가하는 배열을 프린트 하라
## [1] 1
## [1] 1 2
## [1] 1 2 3
## [1] 1 2 3 4
## [1] 1 2 3 4 5
  • 마찬가지로 중괄호를 이용하여 표현을 묶을 수 있다. 반복문의 경우, 조건문과 달리 print 혹은 cat 명령어를 쓰지 않으면 background에서 실행됨. 따라서 표출하고 싶다면 두 명령어를 사용해야함.
for (i in 1:5){
  print(1:i) # i를 1에서 5까지 반복하면서 1부터 1씩 증가하는 배열을 프린트 하라
}
## [1] 1
## [1] 1 2
## [1] 1 2 3
## [1] 1 2 3 4
## [1] 1 2 3 4 5
for(n in c(2,5,10,20,50)){
  x = stats::rnorm(n) # stats라는 패키지 안의 rnorm이라는 함수 사용 (Normal Distribution)
  cat(n, ": ", sum(x^2), "\n", sep = "") # n, :, x 제곱의 합, 줄 바꿈, 구분자는 "")
}
## 2: 2.246834
## 5: 8.983418
## 10: 8.663297
## 20: 19.34989
## 50: 49.61685
f = factor(sample(letters[1:5], 10, replace = TRUE)) #letters (a부터 z까지) 중 처음 다섯글자를 대상으로 무작위 샘플링 10개를 해서 factor로 변환
for(i in unique(f)) print(i) # f 중 겹치지 않는 unique한 값만 하나씩 출력해라
## [1] "c"
## [1] "b"
## [1] "e"
## [1] "a"

while: while (조건) 표현

i = 0
while ( i < 10) {
  print ( i )
  i = i + 1
  }
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9

함수

function: ‘함수명 <- function(인자, 인자, ….) { 함수 본문 }’

fibo = function(n){
  if ( n == 1 | n == 2){
    x = n*2
  } else {
    x = n^2
  }
  return(x)
}
fibo(5)
## [1] 25