R Programming tutorial

R 프로그래밍

R 프로그래밍 언어(줄여서 R)는 통계 계산과 그래픽을 위한 프로그래밍 언어이자 소프트웨어 환경이다.

뉴질랜드 오클랜드 대학의 로스 이하카와 로버트 젠틀맨에 의해 시작되어 현재는 R 코어 팀이 개발하고 있다. R은 GPL 하에 배포되는 S 프로그래밍 언어의 구현으로 GNU S라고도 한다. R은 통계 소프트웨어 개발과 자료 분석에 널리 사용되고 있으며, 패키지 개발이 용이하여 통계학자들 사이에서 통계 소프트웨어 개발에 많이 쓰이고 있다.

R의 문법과 통계처리 부분은 AT&T 벨 연구소가 개발했던 S를 참고했고, 데이터 처리부분은 스킴에 영향을 받았다. - 위키피디아

R 소개

  • 개발자도 배우기 쉽지 않은 언어
    • 함수형, 절차형 언어의 혼합
  • 통계용어 난무
    • 통계학자도 배우기 쉽지 않은 언어 – 프로그래밍의 어려움
  • 자유로운 분석 추구 쉽다.

Object

R에서 Data는 객체(Object)로 표현하고 저장한다. 객체는 인덱스를 가진 구조를 가진 벡터이다.

객체 선언

일반 변수 선언 같이 객체는 대입연산자(“=”, “<-“, “<<-)을 통해 숫자, 문자, 논리형 및 4가지 상수 자료형 값을 넣을 수도 있다.

  • 객체 이름은 알파벳, 숫자, “.”, “_“ 으로 시작한다
  • 큰 따옴표로 둘러싸여지지 않은 이름은 객체로 사용한다
  • R은 대문자와 소문자를 구분합니다. 즉, abc, ABC, abC는 모두 다른 객체로 취급.
  • 숫자로 시작할 수 없다.
  • 예약어를 객체 이름으로 사용할 수 없다.
    • break else FALSE for function if in Inf
    • NA NaN next NULL repeat TRUE while
  • 세미콜론 ; 으로 구문을 구분해 사용할 수 있다.

기본 자료형

자료 저장을 위해 R 에서 사용하는 기본 자료형은 하나의 객체이며 그 종류는 다음과 같습니다. (괄호 안의 영문은 R 내부에서 사용하면 자료 객체의 이름입니다.)

  • 숫자형
    • 정수 (integer)
    • 실수 (numeric)
    • 복소수 (complex)
  • 문자형 (character)
    • 큰따옴표로 둘러 쌓아 표현 : “abc”, “123” 등
  • 논리형 (logical)
    • TRUE(T), FALSE(F)
  • 특수한 상태를 나타내는 상수
    • NULL: 정의되지 않은 값
    • NA : Missing Value
    • -Inf, Inf : 음과 양의 무한대
    • NaN : 수의 연산에서 불능의 경우 표현 0/0, Inf/Inf 등

객체 대입과 접근

R에서 객체로 데이터 형식 없이 대입 연산자 =, <-, <<- 를 이용한다.

할당연산자 의미
= 일반적인 오른쪽 값을 왼쪽 변수에 할당
<- 우변의 결과를 좌변의 객체에
-> 좌변의 결과를 우변의 객체
<<-

변수는 내부적으로 벡터로 저장되어 인덱스로 접근할 수 있다. 벡터 인덱스는 1부터 시작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> x <- 10          #변수 x에 스칼라 값 10을 대입
> x = 10
> x
[1] 10
> x[0] #변수의 요소 접근
numeric(0)

> 'hello' -> h
> x <- 2; y <- 3; #세미콜론
> k <- 2 + 6i #리터럴
> j <- 2 - 3i #리터럴
> k
[1] 2+6i
> k+j
[1] 4+3i

객체에 잘못된 대입의 결과

1
2
3
4
> 1a <- 1             # 변수 1a에 1을 할당. 오류
Error: unexpected symbol in "1a"
> if <- 1 # 변수 if에 1을 할당. 오류
Error: unexpected assignment in "if <-"

이렇게 할당한 객체를 확인하려면

1
2
3
4
5
> ls()                      # 현재 객체 목록
> objects() # 현재 객체 목록
[1] "h" "j" "k" "x" "y"
> mode(h) # 데이터 형식 확인
[1] "character"

객체를 메모리에서 지우려면 rm() 함수를 사용한다.

1
> rm(객체명, 객체명, ...)

삭제 명령

1
2
> rm(x)               # 객체의 삭제
> rm(list=ls()) # 모든 객체 삭제

Scala

스칼라 값은 하나의 단순한 숫자, 문자열 같은 값으로 R에서 변수, 객체의 요소 값을 말한다.

아래 같은 종류의 값을 스칼라 값이라 한다.

  • NA: “데이터 없음” 으로 is.na(x)로 확인 가능
  • NULL: 변수가 초기화 되지 않음을 의미
  • 문자열: ‘’, “”로 묶인 문자열
  • 진리값: TRUE, FALSE로 참, 거짓 표현

상수는

숫자에 의미를 두어 숫자 1,2,3.. 과 문자열인 “pi”, “constant”… 등을 상수로 정의해서 사용한다.
즉 표기 자체의 의미가 변하지 않는 것을 상수라고 하고 숫자와 큰 따옴표로 둘러쌓여진 문자들은 상수로 사용된다.

문자열 함수

1
2
3
4
5
> s <- paste("하나", "1", "둘", "2")      # 문자열 결합
[1] "하나 1 둘 2"
> sp <- strsplit("안 녕 하 세 요", " ") # 문자열 분리
[1] "안" "녕" "하" "세" "요"
> cat("문자열 출력", "\n") # 문자열 결합후 출력

Arithmetic operators

R에서 사용하는 연산자는 +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), %/%(정수나눗셈), %%(나머지), ^(제곱) 등이 있습니다. 우선순위는 표준적인 연산의 우선순위를 따르고, 괄호 안쪽의 수식, 지수 및 근호, 곱하기와 나누기, 더하기와 빼기 순이다.

연산자 의미
+,-,*,/ 사칙연산 x+y, y/y, x-y, x*y
x^y, x**y 거듭제곱 x^2, x**2
x %/% y 정수 나눗셈
x %% y 나머지
1
> 산술연산자 관련 `help(Arithmetic)`

산술연산자 연습:

1
2
3
4
5
6
7
8
9
10
11
12
13
> 10 * 20
[1] 200
> 6 / 2
[1] 3
> 6 %/% 2
[1] 3
> 6 %% 2
[1] 0
> 8**2
[1] 64
> 8^2
[1] 64
>

연산자 우선순위

연산자는 괄호 안쪽의 수식, 지수 및 근호, 곱하기와 나누기, 더하기와 빼기 순입니다.

1
2
3
4
5
6
7
8
> 3/(2-1)                      # 괄호안의 숫자는 항상 우선순위가 높음
[1] 3
-3^2 # 거듭제곱이 먼저 계산
[1] -9
> sqrt(3+1)*2 # 루트의 계산은 sqrt()함수를 사용하며 우선순위가 높음
[1] 4
> 12 + 34 - 56 * 78 / 90 # 곱하기, 나누기의 우선순위는 더하기 빼기보다 높음
[1] -2.533333

논리 연산자

| 연산자 | 의미 | 예 |
| —————- | —————– | ——————– | — | —- |
| TRUE, FALSE | 참 | |
| &&, || | AND 조건, OR 조건 | true && true, x | | y |
| &, | | AND 연산, OR 연산 | x & y |
| !x | 부정 | !true |
| isTRUE(x) | x의 TRUE 판단 | isTRUE(FALSE) |
| xor( ) | | |

논리연산자 실습:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> TRUE || FALSE
[1] TRUE
> TRUE || TRUE
[1] TRUE
> TRUE && FALSE
[1] FALSE
> TRUE && TRUE
[1] TRUE
> TRUE & TRUE
[1] TRUE
> 1 > 5
[1] FALSE
> 10 <= 10
[1] TRUE
> 10 != 1
[1] TRUE
> x <- F
> isTRUE(x)
[1] FALSE

비교 연산자

연산자 의미
<**, **> 작고, 큰 x < y, x > y
>=, <= 크거나/작거나
== 같은

컬렉션 함수를 이용해 데이터세트를 생성한다.

1
2
3
4
5
6
7
8
> 1 > 2
> 6 == 6
> ( 105 ) | ( 4 + 2)
>

> x <- c(1,2,4) # 컬렉션 데이터
> x < 3 # 각 요소의 비교
> x[x<3] <- 0 # TRUE 조건에 0

조건식

컬렉션 함수를 이용해 데이터세트를 생성한다.

1
2
3
4
5
6
> x <- c(1,2,4)                # 컬렉션 데이터
> for(i in 1 : NROW(x)) {
+ if (x[i] < 3) {
+ x[i] <- 0
+ }
+ }

연산자 실습

현재가치와 미래가치를 파악하는 예를 들어 연산자를 사용해 보자.

미래가치를 FV(future value), 현재가치를 PV(present value), 이자율을 r, 기간을 n 이라고 하면 아래 식으로 계산 할 수 있다.

1
2
\\[FV = PV * (1 + r)^{n}\\]
\\[PV = \frac{FV}{(1+ r)^{n}}\\]

‘지금 1억원을 받을래? 1년 뒤에 1억 천만원을 받을래?’ 이제 선택이 쉽지 않습니다. 선택을 위해서는 1년간의 이자율을 알아야 합니다. 1년간의 이자율이 5%라고 가정해보겠습니다. 지금 1억원을 받아 1년간 예금하면 1억 5백만원이 됩니다. 1년 뒤에 1억 천만원을 받는 것이 유리합니다. 만약 이자율이 15%라면 어떨까요? 지금 1억원을 받아 예금해 두면 1년뒤에 1억 1,500만원이 될 것이기 때문에 지금 1억원을 받는 것이 합리적입니다.

  • 이자율이 3%일 때, 1억원을 10년간 예치 한 후 금액은?
  • 10년 후 1억원을 받기 위해서 현재 투자해야 할 금액은?
1
2
3
4
5
6
7
8
9
10
> r <- 0.03              # 이자율 변수 r에 0.03을 할당
> n <- 10 # 기간 변수 n에 10을 할당
> PV <- 100000000 # 현재가치 변수 PV에 1억원을 할당
> FV <- PV * (1+r)^n # 미래가치 FV를 계산
> FV
[1] [1] 134391638 # 이자율 3%로 10년간 1억원 예치시 1억3천만원 수령
> FV <- 100000000 # 미래가치 FV에 1억원을 할당
> PV <- FV/(1+r)^n # 현재가치 PV를 계산
> PV
[1] 38554329

Package 관리

외부에서 제공하는 모듈을 Install, Update, Library 명령으로 관리할 수 있다. 패키지 설치는 Install 그리고 사용할 때는 Library 명령을 사용하고 패키지 갱신에 Update 명령을 사용한다.

패키지 관리

패키지 설치과 업데이트

1
2
3
4
> install.packages("패키지명")      # 패키지 설치
> library("패키지명") # 패키지 불러들이기 (사용)
> require("패키지명") #
> update.packges('패키지명') # 패키지 갱신

설치된 패키지 목록 보기

1
2
3
> Library()
> installed.packages()
> Install.packages()[, c("Packages", "version", "License")]

필수 패키지

  • Install.packages(“rgl”) # 3D 그래프 보여주는 패키지
  • Install.packages(“ggplot2”)
  • Install.packages(“ggthemes”)
  • Install.packages(“data.table”)
  • Install.packages(“devtools”)
  • Install.packages(“KoNLP”)
  • Install.packages(“dplyr”)
  • Install.packages(“plyr”)
  • Install.packages(“reshape2”)
  • Install.packages(“scales”)
  • Install.packages(“stringr”)

Github로 패키지 설치하기

개발자가 베타 버전을 github에 공개하는 경우 Knitr 패키지는 R에서 html, pdf, MS-Word 문서를 만들 수 있음고 https://github.com/yihui/knitr 에서 배포한다.

1
2
3
4
> Install.packages("devtools")
Library("devtools")

> install_github("yihui/knitr")

R 관련 검색

R에서 외부 데이터 읽어들이기

외부에서 정리한 데이터를 R로 가져오면 dataframe 객체(테이블)에 저장된다.

Csv 포맷 문서 읽어들이기

_Read.csv()_ 함수를 사용한다.

1
2
> List <- read.csv("example_studentlist.csv")
> List : ………………………………….

Csv 파일에 column header가 없을 경우,

1
> List <- read.csv("example_studentlist.csv", header=F)

Txt 포맷 데이터 읽기

Read.table() 함수를 사용한다.

1
2
List <- read.table("studentlist.txt")
List : ……………………

파일에 column header가 있을 경우, header=T 인수 필요

1
List <- read.table("studentlist.txt", header=TRUE)

데이터 파일의 데이터 구분자가 예를 들어 세미콜론 ; 인 경우, Read.table() 함수에 sep 인수 추가

1
List <- read.table("studentlist2.txt", header=TRUE, sep=";")

Excel 파일 읽어들이기 위해서 Readxl 패키지 필요

1
2
3
4
Install.packages("readxl")
Library("readxl")
Df <- read_excel(path="studentlist2.xlsx", sheet="Sheet1", col_names = TRUE)
Df: ……………………..

XML 포맷 읽어들이기

1
2
Install.packages("XML")
Library("XML")

Xml 파일 불러오기

DocFromXML <- xmlTreeParse(“score.xml”, useInternal=T)

불필요한 태그 빼고 필요한 컨텐츠만 가져오는 경우, xmlRoot() 사용

1
2
> RootNode <- xmlRoot(DocFromXML)
RootNode : ……………………..

특정 노드값(name) 가져오기

1
2
> Names <- xpathSApply(RootNode, "//name", xmlValue)
Names: ……………

특정 노드값(score) 가져오기

1
> Names <- xpathSApply(RootNode, "//score", xmlValue)

두값(name, score)을 테이블로 만들려면, data.frame() 사용

1
2
> MathScore <- data.frame(NAME=Names, SCORE=Scores)
MathScore : …………………..

웹에 있는 HTML 형식의 테이블 읽어들이기

XML 패키지에 있는 readHTMLTable() 함수를 이용하여 웹에 있는 테이블을 읽어들일 수 있다.

1
2
> RawData <- readHTMLTable(http://cran.r-project.org/web/packages/available_package_by_name.html)
Class(RawData): …………….. list class 상태임.

간편하게 보려면 dataframe 형식으로 변경.

1
2
3
PackageList <- as.data.frame(RawData)
Names(PackageList) <- c(Package Name", "Description") 변수열 이름 조정
Head(PackageList, 5) : PackageList의 1~5 번째 까지의 관측치(Observation) 출력

Control+C, Control+V로 데이터 가져오기. 엑셀에서 데이터 영역 선택 후 Control+C

1
StudentList <- read.delim("clipboard"), read.delim은 header 자동 인식
Author

Gangtai Goh

Posted on

2017-06-01

Updated on

2023-01-14

Licensed under