새소식

강의 및 세미나 자료/R

R 핵심만 배우기 #1 - 스칼라, 요인, 벡터

  • -
R 핵심 기능 #1 - 스칼라, 요인, 벡터

(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
## [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

  1. 2016년 1월 1일부터 7월 14일까지는 며칠인가?
## Time difference of 195 days
  1. 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

  1. fib 원소 중 짝수만 추출하여라
## [1]  0  2  8 34
  1. 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')
  1. money 벡터에서 각 원소의 값을 10으로 나누면?

  2. city 벡터 안에 ‘seoul’ 이라는 값이 있는지 확인하시오.


Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.