(2017년 업데이트 하면서, R(3.4.2버전), R Notebook 으로 작성되었습니다.)
들어가며
안녕하세요. 호돌2 입니다.
시중에는 이미 많은 R 교재와, 수많은 블로그들이 존재합니다. 다만, 성격이 급한 제가 R, Python등을 처음 공부하면서 느꼈던 점은 자주 사용되는 기능들이 강조되기 보다는, 모든 기능들에 대해 단순히 나열되어 있어서 초반에 배우는 게 매우 지루했습니다.
그리고, 이러한 문법 또는 함수가 어느 상황에 사용되는지 직접 경험을 통해 체득할 기회가 적다는 점이었습니다.
본 포스트는 제가 대학생들을 대상으로 R기초 부분 강의를 준비하면서 만들었던 자료를 토대로 기본적이고 필수적인 기능들을 정리해서 작성했습니다.
추가적으로, Quiz 문제를 중간 중간 만들어 보았습니다.
직접 풀어보면서 R 문법/합수가 어떻게 사용되는지 실습해 봅시다. 어느정도 R에 익숙하신 분은 복습 겸 Quiz만 풀어봐도 좋을 것 같네요.
설치하기
R / R studio 설치 방법에 대해서는 ‘R 설치’, ‘R Studio 설치’ 등으로 검색하면 워낙 좋은 글들이 많아서 생략합니다.
http://analyticsstory.com/85
http://rfriend.tistory.com/5
데이터 자료구조이해하기
이번 포스팅은 숫자 1, 문자 ‘a’, 진리형(TRUE, FALSE)와 같은 스칼라형 데이터 형식과 스칼라형 데이터를 담은 벡터(예, 1,2,3,4)에 대한 이야기입니다.
스칼라형 데이터에 대해 알아봅시다
기본적으로 R의 각 원소의 타입은 숫자형, 문자형, 진리형으로 나뉩니다. 쉽게 말해서 컴퓨터에게 이건 숫자야, 이건 문자야, 이건 참/거짓이야 라고 구분지어서 표현해 주는 방법입니다.
a <- 4
b <- 2
4/2
#
5/3
#
5%%2
#
3 == 4
#
3 != 4
#
문자는 숫자와 다르게 항상 따옴표를 사용
first <- 'hello'
second <- "world"
first == second
#
first != second
#
true <- TRUE
false <- FALSE
true & true
#
false & false
#
true & false
#
false | true
#
!false
#
NA는 빈 값을 의미합니다.
empty <- NA
is.na(empty)
#
vec <- c(1,2,3, NA, NA)
length(vec)
#
!is.na(vec)
## [1] TRUE TRUE TRUE FALSE FALSE
sum(!is.na(vec))
#
TRUE == 1
#
Quiz
아래 vector의 NA 값의 개수와, 그렇지 않은 원소의 개수를 계산하시오.
vec <- c(1,2,3, NA, NA)
#
#
요인(Factor) 이란?
factor 는 “문자”데이터라고 이해하면 편합니다.
sex <- factor(c("male", "male","female"))
sex
#
#
실행 결과를 보면 Level 이라는 용어가 오는데, 위 sex factor에는 female, male 이라는 두 원소로 이루어져 있음을 의미합니다. 즉, factor의 unique 한 원소를 의미합니다.
factor를 이용하면 아래와 같이 원소의 종류를 확인할 수 있습니다.
nlevels(sex)
#
levels(sex)
## [1] "female" "male"
levels(sex) <- c('남자','여자')
sex
#
#
table(sex)
#
#
#
Quiz
factor를 활용하여 아래와 같은 table을 만들어보세요.
#
#
#
status <- factor(c("low", "high", "high", "medium", "medium"))
table(status)
#
#
#
ordered_status <- factor(status, levels=c("low", "medium", "high"))
table(ordered_status)
#
#
#
벡터에 대해 좀 더 자세히 알아봅시다.
벡터의 가장 큰 특징은 한가지 타입으로만 통일해야 한다는 점입니다.
c(1, 2, 3, 4, 5)
#
c("1", 2, "3")
## [1] "1" "2" "3"
c(1, 2, 3, c(1, 2, 3))
#
1:10
#
10:1
#
seq(1, 10, 2)
#
rep(1, 10)
#
1 2 3 1 2 3 과 같이 만들고 싶으면?
rep(1:3 ,times = 2)
#
1 1 2 2 3 3 과 같이 만들고 싶으면?
rep(1:3, each = 2)
#
Quiz
아래 수열을 각각 만들어 보세요.
#
#
2015년 1월 1일부터, 2015년 6월 12일까지는 며칠일까?
start <- as.Date('2015-01-01')
end <- as.Date('2015-06-12')
end-start
#
seq(start, end, 10)
## [1] "2015-01-01" "2015-01-11" "2015-01-21" "2015-01-31" "2015-02-10"
## [6] "2015-02-20" "2015-03-02" "2015-03-12" "2015-03-22" "2015-04-01"
## [11] "2015-04-11" "2015-04-21" "2015-05-01" "2015-05-11" "2015-05-21"
## [16] "2015-05-31" "2015-06-10"
seq(start, end, length.out=5)
## [1] "2015-01-01" "2015-02-10" "2015-03-23" "2015-05-02" "2015-06-12"
Quiz
- 2016년 1월 1일부터 7월 14일까지는 며칠인가?
#
- 2016년 7월 14일부터 100일 뒤 날짜는?
#
대괄호 [] 를 잘 이용해 줍니다.
fib <- c(0,1,1,2,3,5,8,13,21,34)
fib[length(fib)]
#
fib[1:3]
#
fib[c(1,3,7)]
#
fib[-2]
#
fib[-c(1:3)]
#
fib <= 5
## [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
fib[fib <= 5]
#
Quiz
- fib 원소 중 짝수만 추출하여라
#
- fib 원소 중 3이상 20이하 원소를 추출
#
years <- c(1960,1964,1976,1994)
names(years)
#
names(years) <- c("Kenndey","Johnson","Carter","Clinton")
years
#
#
years['Carter']
#
#
Quiz
앞의 years 벡터에서 Kennedy, Clinton에 해당하는 년도만 추출?
#
#
두 개의 벡터가 있을 때 각 원소를 더하고 싶으면?
vec1 <- c(1,2,3,4,5)
vec2 <- c(3,3,3,3,3)
vec1 + 10
#
vec1 + vec2
#
vec1 * vec2
#
vec1 ^ vec2
#
vec1 == vec2
## [1] FALSE FALSE TRUE FALSE FALSE
any(c(1,2,3) == c(1,2,5))
#
all(c(1,2,3) == c(1,2,5))
#
vec1 <- c(1,2,3,4,5)
length(vec1)
#
nrow(vec1)
#
NROW(vec1)
#
'박근혜' %in% c('김대중','이명박','노무현')
#
'c' %in% c('a','b','c')
#
Quiz
아래와 같이 money, city 두 벡터가 있다.
money <- c(100,200,300)
city <- c('seoul','tokyo','beijing')
money 벡터에서 각 원소의 값을 10으로 나누면?
city 벡터 안에 ‘seoul’ 이라는 값이 있는지 확인하시오.