R 핵심만 배우기 #1 - 스칼라, 요인, 벡터
- -
R 핵심 기능 #1 - 스칼라, 요인, 벡터
호돌2
2017년 10월 29일
(2017년 업데이트 하면서, R(3.4.2버전), R Notebook 으로 작성되었습니다.)
들어가며
안녕하세요. 호돌2 입니다.
시중에는 이미 많은 R 교재와, 수많은 블로그들이 존재합니다. 다만, 성격이 급한 제가 R, Python등을 처음 공부하면서 느꼈던 점은 자주 사용되는 기능들이 강조되기 보다는, 모든 기능들에 대해 단순히 나열되어 있어서 초반에 배우는 게 매우 지루했습니다.
그리고, 이러한 문법 또는 함수가 어느 상황에 사용되는지 직접 경험을 통해 체득할 기회가 적다는 점이었습니다.
본 포스트는 제가 대학생들을 대상으로 R기초 부분 강의를 준비하면서 만들었던 자료를 토대로 기본적이고 필수적인 기능들을 정리해서 작성했습니다.
추가적으로, Quiz 문제를 중간 중간 만들어 보았습니다.
직접 풀어보면서 R 문법/합수가 어떻게 사용되는지 실습해 봅시다. 어느정도 R에 익숙하신 분은 복습 겸 Quiz만 풀어봐도 좋을 것 같네요.
설치하기
R / R studio 설치 방법에 대해서는 ‘R 설치’, ‘R Studio 설치’ 등으로 검색하면 워낙 좋은 글들이 많아서 생략합니다.
데이터 자료구조이해하기
이번 포스팅은 숫자 1, 문자 ‘a’, 진리형(TRUE, FALSE)와 같은 스칼라형 데이터 형식과 스칼라형 데이터를 담은 벡터(예, 1,2,3,4)에 대한 이야기입니다.
스칼라형 데이터에 대해 알아봅시다
기본적으로 R의 각 원소의 타입은 숫자형, 문자형, 진리형으로 나뉩니다. 쉽게 말해서 컴퓨터에게 이건 숫자야, 이건 문자야, 이건 참/거짓이야 라고 구분지어서 표현해 주는 방법입니다.
# 숫자형
a <- 4
b <- 2
# 숫자형 연산
4/2
## [1] 2
5/3
## [1] 1.666667
5%%2
## [1] 1
3 == 4 #같아?
## [1] FALSE
3 != 4 #달라?
## [1] TRUE
문자는 숫자와 다르게 항상 따옴표를 사용
first <- 'hello'
second <- "world"
first == second
## [1] FALSE
first != second
## [1] TRUE
#진리형
true <- TRUE
false <- FALSE
true & true # &는 AND 조건을 의미
## [1] TRUE
false & false
## [1] FALSE
true & false
## [1] FALSE
false | true # |는 OR 조건을 의미
## [1] TRUE
!false # ! 는 NOT 을 의미
## [1] TRUE
NA는 빈 값을 의미합니다.
empty <- NA #결측값
is.na(empty) #is.na 를 통해 결측값이 있는지 없는지 확인할 수 있습니다.
## [1] TRUE
vec <- c(1,2,3, NA, NA)
length(vec) #vector의 길이를 계산
## [1] 5
!is.na(vec)
## [1] TRUE TRUE TRUE FALSE FALSE
sum(!is.na(vec))
## [1] 3
TRUE == 1
## [1] TRUE
Quiz
아래 vector의 NA 값의 개수와, 그렇지 않은 원소의 개수를 계산하시오.
vec <- c(1,2,3, NA, NA)
## NA값 개수는 2
## NA이 아닌 원소 개수는 3
요인(Factor) 이란?
factor 는 “문자”데이터라고 이해하면 편합니다.
sex <- factor(c("male", "male","female")) #male 2개, female 1개의 원소로 이뤄진 vector
sex
## [1] male male female
## Levels: female male
실행 결과를 보면 Level 이라는 용어가 오는데, 위 sex factor에는 female, male 이라는 두 원소로 이루어져 있음을 의미합니다. 즉, factor의 unique 한 원소를 의미합니다.
factor를 이용하면 아래와 같이 원소의 종류를 확인할 수 있습니다.
nlevels(sex) #number of levels
## [1] 2
levels(sex) #level의 종류
## [1] "female" "male"
levels(sex) <- c('남자','여자') #레벨값 수정하기
sex
## [1] 여자 여자 남자
## Levels: 남자 여자
table(sex) #factor별 요약정보 확인하기
## sex
## 남자 여자
## 1 2
Quiz
factor를 활용하여 아래와 같은 table을 만들어보세요.
##
## 일본 중국 한국
## 2 1 2
- factor의 순서 바꾸기
#5개의 과목의 점수가 아래와 같다
status <- factor(c("low", "high", "high", "medium", "medium"))
table(status)
## status
## high low medium
## 2 1 2
#low, medium, high 순서로 바꾸고 싶으면?
ordered_status <- factor(status, levels=c("low", "medium", "high"))
table(ordered_status)
## ordered_status
## low medium high
## 1 2 2
벡터에 대해 좀 더 자세히 알아봅시다.
벡터의 가장 큰 특징은 한가지 타입으로만 통일해야 한다는 점입니다.
c(1, 2, 3, 4, 5)
## [1] 1 2 3 4 5
c("1", 2, "3") #문자와 숫자를 섞었더니 2를 자동으로 문자열 타입으로 바꿈
## [1] "1" "2" "3"
c(1, 2, 3, c(1, 2, 3)) #벡터는 중첩이 안됨
## [1] 1 2 3 1 2 3
- 수열 만들기
1:10 #1부터 10까지
## [1] 1 2 3 4 5 6 7 8 9 10
10:1 #10에서 1까지
## [1] 10 9 8 7 6 5 4 3 2 1
seq(1, 10, 2) # 1부터 10까지 2씩 차이나게, seq(from, to, by)
## [1] 1 3 5 7 9
rep(1, 10) #rep(원소, 반복횟수)
## [1] 1 1 1 1 1 1 1 1 1 1
1 2 3 1 2 3 과 같이 만들고 싶으면?
rep(1:3 ,times = 2)
## [1] 1 2 3 1 2 3
1 1 2 2 3 3 과 같이 만들고 싶으면?
rep(1:3, each = 2)
## [1] 1 1 2 2 3 3
Quiz
아래 수열을 각각 만들어 보세요.
## [1] 10 8 6 4 2
## [1] 5 5 4 4 3 3 2 2
- 수열만들기 보너스
2015년 1월 1일부터, 2015년 6월 12일까지는 며칠일까?
start <- as.Date('2015-01-01')
end <- as.Date('2015-06-12')
end-start
## Time difference of 162 days
#10일단위로 보고싶으면?
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"
#5등분 하고 싶으면?
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일까지는 며칠인가?
## Time difference of 195 days
- 2016년 7월 14일부터 100일 뒤 날짜는?
## [1] "2016-10-22"
- 벡터 내 원소 접근하기 : Indexing
대괄호 [] 를 잘 이용해 줍니다.
fib <- c(0,1,1,2,3,5,8,13,21,34)
#fib vector의 첫번째 원소는?
fib[length(fib)]
## [1] 34
#fib vector의 첫번째부터 3번째 원소는?
fib[1:3]
## [1] 0 1 1
#fib vector의 1번째, 3번째, 7번째는?
fib[c(1,3,7)]
## [1] 0 1 8
#비슷하게 해당 index의 원소를 제거하고 싶으면
fib[-2]
## [1] 0 1 2 3 5 8 13 21 34
fib[-c(1:3)]
## [1] 2 3 5 8 13 21 34
#fib 원소 중 5이하의 값만 추출하고 싶으면?
fib <= 5
## [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
fib[fib <= 5]
## [1] 0 1 1 2 3 5
Quiz
- fib 원소 중 짝수만 추출하여라
## [1] 0 2 8 34
- fib 원소 중 3이상 20이하 원소를 추출
## [1] 3 5 8 13
- 벡터에 이름 붙여서 indexing 하기
years <- c(1960,1964,1976,1994)
names(years) #처음에는 아무 이름도 없다
## NULL
names(years) <- c("Kenndey","Johnson","Carter","Clinton") #이름 지정하는 방법
years
## Kenndey Johnson Carter Clinton
## 1960 1964 1976 1994
years['Carter']
## Carter
## 1976
Quiz
앞의 years 벡터에서 Kennedy, Clinton에 해당하는 년도만 추출?
## Kenndey Clinton
## 1960 1994
- 벡터 연산하기
두 개의 벡터가 있을 때 각 원소를 더하고 싶으면?
vec1 <- c(1,2,3,4,5)
vec2 <- c(3,3,3,3,3)
vec1 + 10 #vec1의 각 원소에 10씩 더함
## [1] 11 12 13 14 15
vec1 + vec2 #각 원소간 합
## [1] 4 5 6 7 8
vec1 * vec2 #각 원소간 곱
## [1] 3 6 9 12 15
vec1 ^ vec2 #각 원소간 n제곱
## [1] 1 8 27 64 125
- 벡터 비교하기
vec1 == vec2
## [1] FALSE FALSE TRUE FALSE FALSE
#두 벡터가 하나라도 같은 원소가 있는지?
any(c(1,2,3) == c(1,2,5))
## [1] TRUE
#두 벡터가 모두 같은 원소가 있는지?
all(c(1,2,3) == c(1,2,5))
## [1] FALSE
- 기타 벡터 관련 함수
vec1 <- c(1,2,3,4,5)
length(vec1) #벡터 길이 계산
## [1] 5
nrow(vec1) #소문자 nrow는 행렬의 길이 확인
## NULL
NROW(vec1) #대문자 NROW는 벡터와 행렬 길이 확인
## [1] 5
#벡터 안에 원소가 있는지 확인
'박근혜' %in% c('김대중','이명박','노무현')
## [1] FALSE
'c' %in% c('a','b','c')
## [1] TRUE
Quiz
아래와 같이 money, city 두 벡터가 있다.
money <- c(100,200,300)
city <- c('seoul','tokyo','beijing')
money 벡터에서 각 원소의 값을 10으로 나누면?
city 벡터 안에 ‘seoul’ 이라는 값이 있는지 확인하시오.
'강의 및 세미나 자료 > R' 카테고리의 다른 글
R로 크롤링하기 - 보배드림 예제 (20) | 2016.08.07 |
---|---|
R 핵심만 배우기 #5 - dplyr (1) | 2016.08.04 |
R 핵심만 배우기 #4 - 데이터 프레임 2번째 (5) | 2016.08.03 |
R 핵심만 배우기 #3 - 데이터 프레임(data.frame) 첫번째 (1) | 2016.08.01 |
R 핵심만 배우기 #2 - 리스트, 메트릭스, 배열 (0) | 2016.08.01 |
소중한 공감 감사합니다