강의자료는 아래 링크에서 확인하실 수 있습니다

http://www.slideshare.net/neuroassociates/2-week3-r-basic

수치 연산자

?Arithmetic으로 검색하면 도움말을 살펴볼 수 있다.

2 + 4 # 6
## [1] 6
2 - 4 # -2
## [1] -2
2 * 4 # 8
## [1] 8
2 / 4 # 0.5
## [1] 0.5
2 ^ 4 # 지수 : 2의 4승
## [1] 16
2 ** 4 # 지수 : 2의 4승
## [1] 16
7 %/% 3 # 몫을 구한다
## [1] 2
7 %% 3 # 나머지를 구한다
## [1] 1




비교 연산자

3 >  4
## [1] FALSE
3 >= 4
## [1] FALSE
3 <  4
## [1] TRUE
3 <= 4
## [1] TRUE
4 == 4 # 같다
## [1] TRUE
4 != 4 # 다르다
## [1] FALSE

%in%연산자의 경우 연산자를 기준으로 왼쪽에 있는 항목이 오른쪽에 벡터 내에 존재하는지를 판단한다

'May' %in% month.name
## [1] TRUE
5 %in% 10:20
## [1] FALSE




반복문 for

for(비어있는 변수 in 벡터){
  code
}

의 형태로 사용된다

벡터의 길이만큼 반복되고, 벡터의 각 요소가 변수에 저장되어 내부의 코드가 작동한다.

for(i in c(1,2,3)){
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
month.name
##  [1] "January"   "February"  "March"     "April"     "May"      
##  [6] "June"      "July"      "August"    "September" "October"  
## [11] "November"  "December"
for(m in month.name){
  print(m)
}
## [1] "January"
## [1] "February"
## [1] "March"
## [1] "April"
## [1] "May"
## [1] "June"
## [1] "July"
## [1] "August"
## [1] "September"
## [1] "October"
## [1] "November"
## [1] "December"

조건문 if

if(조건){
  true일 때 code
} else {
  false일 때 code
}

의 형태로 사용된다.

아래 처럼 조건 없이 그냥 TRUEFALSE를 넣어도 마찬가지로 동작한다

if(TRUE){
  print('this is true')
} else {
  print('this is false')
}
## [1] "this is true"
if(FALSE){
  print('this is true')
} else {
  print('this is false')
}
## [1] "this is false"

일반적으로는 아래와 같이 논리값을 반환하는 비교 연산을 통해 조건문을 실행시킨다.

if(5 > 4){
  print('this is true')
} else {
  print('this is false')
}
## [1] "this is true"
if(3 > 4){
  print('this is true')
} else {
  print('this is false')
}
## [1] "this is false"

알파벳 중에서 모음일 경우에만 문자를 출력하려고 한다면 다음과 같이 할 수 있다.

내장된 변수인 letters 를 이용해보자

for(chr in letters){
  if(chr %in% c('a','e','i','o','u')){
    print(chr)
  }
}
## [1] "a"
## [1] "e"
## [1] "i"
## [1] "o"
## [1] "u"




조건문/반복문 예제


1강때 썼던 데이터 프레임

score_df = data.frame(
  math = c(40, 70, 80),
  korean = c(50, 60, 70),
  english = c(30, 40, 50),
  art = c('A','A','C')
)



미술점수를 숫자로 바꾸기

현재 미술점수는 ‘A’, ’C’로 구성된 factor로 되어있다.

이것을 숫자로 된 점수로 환산해보려고 한다.

score_df$art
## [1] A A C
## Levels: A C



for문을 통해 점수를 하나씩 불러오기

for(art in score_df$art){
  print(art)
}
## [1] "A"
## [1] "A"
## [1] "C"



if문을 추가해서 학점 구분해보기

데이터는 저장되지 않지만 제대로 확인하고 있는지 테스트하기 위해 print 함수로 값만 출력해본다.

for(art in score_df$art){
  if(art == 'A'){
    print('100')
  } else if(art == 'B'){
    print('80')
  } else {
    print('60')
  }
}
## [1] "100"
## [1] "100"
## [1] "60"



숫자로 환산한 미술 점수를 데이터 프레임에 저장해보자

벡터에 순서대로 값을 넣는 방법?

벡터는 중첩되지 않는다는 사실을 기억하자

c(1,2,3,4,5, c(6,7,8)) # 의 결과물은
## [1] 1 2 3 4 5 6 7 8
1:8 # 또는 c(1,2,3,4,5,6,7,8)과 같다
## [1] 1 2 3 4 5 6 7 8



a = 10
b = c()
print(b)
## NULL
b = c(b, a)
print(b)
## [1] 10
b = c(b, a)
print(b)
## [1] 10 10
b = c(b, a)
print(b)
## [1] 10 10 10

이렇게 하면 벡터 b에는 a의 값이 세 번 들어가서 저장된다.



이제 미술 점수를 담을 빈 벡터를 만들고 숫자로 환산한 미술점수를 벡터에 저장하자.

art_score = c()

for(art in score_df$art){
  if(art == 'A'){
    art_score = c(art_score, 100)
  } else if(art == 'C'){
    art_score = c(art_score, 60)
  } else {
    art_score = c(art_score, 80)
  }
}

art_score # 100 100 60 이 들어간다
## [1] 100 100  60



미술점수에 숫자 점수를 덮어씌운다

score_df$art = art_score

데이터 프레임이 제대로 변경되었는지 확인해보자

score_df
##   math korean english art
## 1   40     50      30 100
## 2   70     60      40 100
## 3   80     70      50  60




과목별로 평균내보기

우선 시작하기 전에 함수 두 가지를 먼저 살펴보자.

names()

데이터프레임에 사용하면 열 이름들을 벡터로 출력해준다

names(score_df)
## [1] "math"    "korean"  "english" "art"



dim()

데이터프레임에 사용하면 행의 개수와 열의 개수를 벡터로 출력해준다

dim(score_df)
## [1] 3 4

score_df의 열의 개수는 dim(score_df)의 두 번째 항목에서 확인할 수 있다.

dim(score_df)[2]
## [1] 4



score_df의 열 이름을 하나씩 출력해보자

for(index in 1:dim(score_df)[2]){
  print(
    names(score_df)[index]
    )
}
## [1] "math"
## [1] "korean"
## [1] "english"
## [1] "art"



score_df의 열을 벡터단위로 하나씩 출력해보자

comma를 빠뜨리면 벡터가 아니라 데이터 프레임으로 출력된다

그러면 mean()을 못쓴다ㅠㅠ

for(index in 1:dim(score_df)[2]){
 print(
   score_df[, index]
   )
}
## [1] 40 70 80
## [1] 50 60 70
## [1] 30 40 50
## [1] 100 100  60



mean()을 이용해서 평균을 각각 계산해보자

for(index in 1:dim(score_df)[2]){
  print(
    mean(score_df[, index])
    )
}
## [1] 63.33333
## [1] 60
## [1] 40
## [1] 86.66667



어느 과목의 점수인지 표시해주자

for(index in 1:dim(score_df)[2]){
  print(
    names(score_df)[index]
    )
  print(
    mean(score_df[, index])
  )
}
## [1] "math"
## [1] 63.33333
## [1] "korean"
## [1] 60
## [1] "english"
## [1] 40
## [1] "art"
## [1] 86.66667



이런식으로 값을 출력하기만 하면 데이터를 활용하기가 힘들다

벡터를 새로 만들어서 평균을 저장해보자

score_mean = c()

for(index in 1:dim(score_df)[2]){
  mean_value = mean(score_df[, index])
  score_mean = c(score_mean, mean_value)
}

score_mean
## [1] 63.33333 60.00000 40.00000 86.66667



어떤 과목의 평균인지 알 수가 없기 때문에 score_mean벡터에 score_df의 name을 덮어 씌우자

names(score_mean) = names(score_df)
score_mean
##     math   korean  english      art 
## 63.33333 60.00000 40.00000 86.66667



그리고 이 모든 과정을 한 줄로 끝내는..

sapply(score_df, mean)
##     math   korean  english      art 
## 63.33333 60.00000 40.00000 86.66667



실습 및 과제

2015년 8월 13일 0시부터 23시까지 서울과 대구의 기온 데이터

파일의 인코딩이 utf-8로 되어있기 때문에 맥 및 리눅스 사용자는 인코딩 옵션 없이 사용할 수 있다.

윈도우 사용자는 R-Studio의 기본인코딩을 변경하거나 fileEncoding옵션을 변경해서 사용할 수 있다.

temperature = read.csv('weather_data.csv', fileEncoding='UTF-8')



우선 데이터의 형태를 살펴보자

str(temperature)
## 'data.frame':    48 obs. of  4 variables:
##  $ location: Factor w/ 2 levels "대구","서울": 2 2 2 2 2 2 2 2 2 2 ...
##  $ date    : Factor w/ 1 level "2015-08-13": 1 1 1 1 1 1 1 1 1 1 ...
##  $ hour    : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ temp    : num  26.1 25.7 25.2 24.8 24.3 24 23.9 24.1 25.8 27.5 ...



location과 date가 factor로 들어와 있다

character로 바꾸려면 as.character()를 사용한다.

# character
as.character(temperature$location)
##  [1] "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울"
## [11] "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울" "서울"
## [21] "서울" "서울" "서울" "서울" "대구" "대구" "대구" "대구" "대구" "대구"
## [31] "대구" "대구" "대구" "대구" "대구" "대구" "대구" "대구" "대구" "대구"
## [41] "대구" "대구" "대구" "대구" "대구" "대구" "대구" "대구"

factor로 되어있던 원래 데이터를 chr로 변경한 다음에 원래 데이터에 덮어 씌우자

temperature$location = as.character(temperature$location)
temperature$date = as.character(temperature$date)

str함수로 팩터가 문자로 제대로 변경되었는지 확인해보자

str(temperature)
## 'data.frame':    48 obs. of  4 variables:
##  $ location: chr  "서울" "서울" "서울" "서울" ...
##  $ date    : chr  "2015-08-13" "2015-08-13" "2015-08-13" "2015-08-13" ...
##  $ hour    : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ temp    : num  26.1 25.7 25.2 24.8 24.3 24 23.9 24.1 25.8 27.5 ...



서울기온에 해당하는 자료만 인덱싱해서 벡터에 저장한다

seoul_temp = temperature[temperature$location == '서울', 'temp']



산점도 및 막대그래프는 다음과 같이 그릴 수 있다

plot(seoul_temp)

barplot(seoul_temp)

서울의 기온이 서울의 평균기온보다 높을 경우 '#821122' 를 낮을경우 '#cccccc'를 색으로 지정해보자

seoul_color = c()
for(temp in seoul_temp){
  if(temp > mean(seoul_temp)){
    seoul_color = c(seoul_color, '#821122')
  }else{
    seoul_color = c(seoul_color, '#cccccc')
  }
}

seoul_color
##  [1] "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc"
##  [8] "#cccccc" "#cccccc" "#821122" "#821122" "#821122" "#821122" "#821122"
## [15] "#821122" "#821122" "#821122" "#821122" "#821122" "#821122" "#cccccc"
## [22] "#cccccc" "#cccccc" "#cccccc"

sapply함수와 ifelse함수를 이용해서 한 줄로 코드를 요약하면 다음과 같다

sapply(seoul_temp, function(x) ifelse(x>mean(seoul_temp), '#821122', '#cccccc'))
##  [1] "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc" "#cccccc"
##  [8] "#cccccc" "#cccccc" "#821122" "#821122" "#821122" "#821122" "#821122"
## [15] "#821122" "#821122" "#821122" "#821122" "#821122" "#821122" "#cccccc"
## [22] "#cccccc" "#cccccc" "#cccccc"



생성한 seoul_color 벡터를 col 옵션에 반영해서 막대의 그래프를 변경한다.

border = NA옵션을 통해 막대의 테두리 선을 보이지 않도록 한다.

barplot(seoul_temp, col = seoul_color, border = NA)