강의자료는 아래 링크에서 확인하실 수 있습니다
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(비어있는 변수 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(조건){
true일 때 code
} else {
false일 때 code
}
의 형태로 사용된다.
아래 처럼 조건 없이 그냥 TRUE
나 FALSE
를 넣어도 마찬가지로 동작한다
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"
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(art in score_df$art){
print(art)
}
## [1] "A"
## [1] "A"
## [1] "C"
데이터는 저장되지 않지만 제대로 확인하고 있는지 테스트하기 위해 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
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)