1. R 연산자, 조건문, 반복문, 함수
1.1 연산자
- 산술연산자, 비교연산자, 논리연산자가 있으며, 파이썬과 유사하나 별색 처리한 연산자는 다소 차이가 있다.
✅ 산술연산자
32^7 # 제곱
10%%3 # 나머지
10%/%3 # 몫
346434%%3343 # 나머지
346434%/%3343 # 몫
✅ 논리연산자
a <- c(T, T) & c(F, T) # 벡터화된 논리 곱
a # [OUT] FALSE TRUE
b <- c(T, T) && c(F, T) # 벡터화되지 않은 논리 곱 (첫번째 값만 비교)
b # [OUT] FALSE
c <- c(T, T) | c(F, T) # 벡터화된 논리합 (or)
c # [OUT] TRUE TRUE
d <- c(T, T) || c(F, T) # 벡터화되지 않은 논리 합 (첫번째 값만 비교)
d # [OUT] TRUE
e <- !TRUE # ! : 논리 부정
e # [OUT] FALSE
✅ 산술 함수
- prod() 함수 : 입력 벡터 중 곱셈 값 출력
- factorial() 함수 : 팩토리얼 값 출력
- abs() 함수 : 절대값 출력
- range() 함수 : 입력 벡터의 최소값, 최대값 출력
- var() 함수 : 입력 벡터의 평균에 대한 분산값 출력
- sd() 함수 : 입력 벡터의 평균에 대한 표준편차값 출력
min(c(1, 2, 3, 4, 5)) # [OUT] 1
max(c(1, 2, 3, 4, 5)) # [OUT] 5
sum(c(1, 2, 3, 4, 5)) # [OUT] 15
mean(c(1, 2, 5, 8, 10)) # [OUT] 5.2
median(c(1, 2, 5, 8, 10)) # [OUT] 5
# 1. prod() 함수 : 입력 벡터 중 곱셈 값 출력
prod(c(1, 2, 3, 4, 5)) # [OUT] 120
# 2. factorial() 함수 : 팩토리얼 값 출력
factorial(4) # [OUT] 24
factorial(c(1, 2, 3, -4)) # [OUT] 1 2 6 NaN
# 3. abs() 함수 : 절대값 출력
abs(c(1, -2, 3, 4, -5)) # [OUT] 1 2 3 4 5
# 4. range() 함수 : 입력 벡터의 최소값, 최대값 출력
range(c(1, 2, 3, 4, 5)) # [OUT] 1 5
range(c(10, 2, 4, 4, 77)) # [OUT] 2 77
# 5. var() 함수 : 입력 벡터의 평균에 대한 분산값 출력
var(c(1, 2, 5, 8, 10)) # [OUT] 14.7
# 6. sd() 함수 : 입력 벡터의 평균에 대한 표준편차값 출력
sd(c(1, 2, 5, 8, 10)) # [OUT] 3.834058
✅ 문자열 관련 함수
- paste() : 값들을 하나의 문자열로 합치는 함수
- rep() : data로 초기화되는 길이가 n인 벡터 생성
# 1. paste() : 값들을 하나의 문자열로 합치는 함수
paste('안녕', '하세요') # [OUT] "안녕 하세요"
paste('안녕', '하세요', sep = '') # [OUT] "안녕하세요"
paste(c(1, 2, 3), c('번', '번', '번')) # [OUT] "1 번" "2 번" "3 번"
# 2. rep() : data로 초기화되는 길이가 n인 벡터 생성
rep(1, 5) # [OUT] 1 1 1 1 1
# 활용
index <- c(1, 2, 3)
len <- length(index)
paste(index, rep('번', len)) # [OUT] "1 번" "2 번" "3 번"
▼ 💡 실습 💡▼

- 운항이 평균 실적보다 높은 항공사들을 벡터 형태로 출력
upper_avg_flight <- flight >= mean(flight)
result <- airline[upper_avg_flight]
print(result) # [OUT] "아시아나항공" "제주항공" "대한항공"
1.2 조건문
✅ if ~ else문
score <- scan() # 직접 입력 (파이썬 input()과 유사)
passScore <- 50
if (score > passScore){
print('합격')
} else {
print('불합격')
}
✅ ifelse문 (삼항연산자)
- ifelse(조건식, 참일 때 실행문, 거짓일 때 실행문)
- 벡터 연산 가능
score <- c(30, 90, 75, 82)
result <- ifelse(score >= 50, '합격', '불합격')
print(result) # [OUT] "불합격" "합격" "합격" "합격"
✅ switch문
- switch(입력값, 비교값 = 실행문, ..., 기본 실행문)
x <- 'age'
y <- 'name'
result1 <- switch(x, 'word' = 'hi', 'age' = 25, '3' = '숫자', NULL)
result1 # [OUT] 25
result2 <- switch(y, 'word' = 'hi', 'age' = 25, '3' = '숫자', NULL)
result2 # [OUT] NULL
✅ which문
- which(조건문)
- 조건에 해당하는 입력 벡터 내부 값의 인덱스(위치)를 반환
score <- c(30, 90, 75, 82)
results <- which(score >= 50)
print(results) # [OUT] 2 3 4
score[results] # [OUT] 90 75 82
▼ 💡 실습 💡▼
1) 온도(숫자) 값을 입력 받아 30도 이상이면 “더움”, 20~30도 사이면 “보통”, 10~20도 사이면 “선선”, 0~10도 사이면 “추움”, 0도 이하면 “매우 추움” 을 출력하는 코드를 작성하세요.
temp <- scan()
if (temp >= 30){
print('더움')
} else if (temp >= 20){
print('보통')
} else if (temp >= 10){
print('신선')
} else if (temp >= 0){
print('추움')
} else {
print('매우 추움')
}
2) 식사량 설문조사를 진행하기 위하여, 범주형 값을 입력 받을 때마다 수치 값으로 변환하는 프로그램을 작성
# “매우 많이”는 100, “많이”는 70, “보통”은 50, “조금”은 30, 그 외는 0으로 수정하는 조건문을 작성하세요.
# data 변수에 범주형 값이 들어있다고 가정하세요.
# if~else 문을 사용하세요.
data <- '매우 많이'
if (data == '매우 많이'){
result <- 100
} else if (data == '많이'){
result <- 70
} else if (data == '보통'){
result <- 50
} else if (data == '조금'){
result <- 30
} else {
result <- 0
}
print(result) # [OUT] 100
3) 식사량 설문조사를 진행하기 위하여, 범주형 값을 입력 받을 때마다 수치 값으로 변환하는 프로그램을 작성
# “매우 많이”는 100, “많이”는 70, “보통”은 50, “조금”은 30, 그 외는 0으로 수정하는 조건문을 작성하세요.
# data 변수에 범주형 값이 들어있다고 가정하세요.
# switch 문을 사용하세요.
data <- '매우 많이'
result <- switch(data, '매우 많이' = 100, '많이' = 70, '보통' = 50, '조금' = 30, 0)
print(result) # [OUT] 100
4) 운항 횟수가 1000회 이상이면 '우수‘, 그 이하면 '보통‘ 값을 가지는 벡터를 생성하세요.
airline <- c('아시아나항공', '에어부산', '에어프레미아', '에어서울', '제주항공', '진에어', '대한항공', '티웨이항공')
flight <- c(1575, 481, 124, 354, 1197, 793, 1670, 859)
passenger <- c(249792, 90985, 29238, 71213, 203335, 133253, 250895, 146497)
freight <- c(3097.9, 516.7, 111.1, 273.1, 847.1, 763.2, 5406.1, 597.6)
result4 <- ifelse(flight >= 1000, '우수', '보통')
print(result4) # [OUT] "우수" "보통" "보통" "보통" "우수" "보통" "우수" "보통"
5) 운항이 평균 실적보다 높은 항공사들을 벡터 형태로 출력 (which문 사용)
upper_avg_flight2 <- which(flight > mean(flight))
result5 <- airline[upper_avg_flight2]
print(result5) # [OUT] "아시아나항공" "제주항공" "대한항공"
1.3 반복문
✅ for문
# 각 값이 2의 배수라면 TRUE를, 아니라면 FALSE를 출력하는 프로그램을 구현
data <- c(32, 45, 21, 10, 43)
result <- c()
for (i in data){
if (i %% 2 == 0){
result <- c(result, TRUE)
} else {
result <- c(result, FALSE)
}
}
print(result) # [OUT] TRUE FALSE FALSE TRUE FALSE
✅ while문
- 조건식이 FALSE라면 반복 종료
- 산술 값 계산 or 위치(index) 값을 사용할 때 주로 사용
# 홀수 자리 값의 합을 출력하는 프로그램을 구현
data <- c(32, 45, 21, 10, 43)
sum <- 0
i <- 1
while (i <= length(data)){
if (i %% 2 == 1){
sum <- sum + data[i]
}
i <- i+1
}
print(sum)
✅ repeat문
- repeat{명령문}
i <- 1
repeat{
print(i) # 출력 (반복 내용)
if(i > 9){
break
} # 반복 종료 조건
i <- i + 1 # 변수 조정
}
1.4 사용자 정의 함수
- 사용자가 직접 정의하여 만들어내는 함수
함수명 <- function(매개변수1, 매개변수2 = 초기 값, ..){
# 실행문
return(리턴 값) # 생략 가능
}
✅ 평균, 표준편차, min, max 계산 함수
get_statics <- function(x){
x.mean <- mean(x)
x.sd <- sd(x)
x.min <- min(x)
x.max <- max(x)
x.summary <- c('mean' = x.mean, 'sd' = x.sd, 'min' = x.min, 'max' = x.max)
return(x.summary)
}
statics <- get_statics(c(1, 2, 3, 4, 5))
print(statics)
✅ D-day 계산
D_day <- function(year, month, day){
today <- Sys.Date() # 오늘 날짜
input_day_str <- paste(year, month, day, sep = '-') # 형변환을 위해 날짜형식으로 변경
input_day <- as.Date(input_day_str) # Date 형식으로 형 변환
D_days <- difftime(today, input_day) # 오늘 날짜 - 입력 날짜
return(as.integer(D_days))
}
d_day <- D_day(2022, 02, 21)
print(d_day)
✅ 다른 파일에 있는 함수를 사용해서 데이터 값을 로딩하기
## airport.R 파일에 있는 함수 가져오기
source('airport.R', encoding = 'UTF-8')
airline <- get_airline()
print(airline)
flight <- get_flight()
print(flight)
passenger <- get_passenger()
print(passenger)
freight <- get_freight()
print(freight)
airport <- get_airport()
print(airport)
## airport.R 파일에 있는 함수
upper_avg_airline_17 <- function(){
upper_avg_flight <- flight >= mean(flight)
result <- airline[upper_avg_flight]
return(result)
}
upper_avg_airline_18 <- function(){
upper_avg_flight2 <- which(flight > mean(flight))
result <- airline[upper_avg_flight2]
return(result)
}
upper_avg_airline_19 <- function(){
result <- c()
i <- 1
while(i <= length(flight)){
if (flight[i] >= mean(flight)){
result <- c(result, airline[i])
}
i <- i + 1
}
return(result)
}
1.5 데이터 가져오기, 내보내기
✅ 데이터 가져오기
- scan() : 키보드 입력 / numeric 형식 값만 입력 가능
- scan(what = character/logical()) : character / logical 형식 값 입력 가능
- 테이블(행렬) 형식 파일 : read.table(파일명, header=TRUE, sep=“”, col.names=c(), na.string=“”)
- csv 형식 파일 : read.csv(파일명, header=TRUE, col.names=c(), na.string=“”)
- 엑셀 형식 파일 (패키지 설치) : read_excel(파일명, sheet=NULL, range=NULL, col_names=TRUE, col_types=NULL, na=“”)
## 1. 텍스트 파일 가져오기
data <- read.table("student.txt", # 파일 이름
header = TRUE, # 데이터 첫 행에 변수명 존재 여부
sep = ";", # 구분자
fileEncoding = 'CP949') # 파일 깨짐 방지
## 2. 결측치 있는 텍스트 파일 가져오기
data <- read.table("student2.txt",
header = TRUE,
sep = ' ',
na.strings = '-',
fileEncoding = 'CP949')
# (header = TRUE가 디폴트값이나 쓰지 않으면 FALSE 결과값의 컬럼명도 함께 출력됨)
data <- read.table("student2.txt",
sep = ' ',
na.strings = '-',
fileEncoding = 'CP949')
## 3. csv 파일 가져오기
data <- read.csv('student3.csv',
header = FALSE,
col.name = c('학번', '이름', '학년', '성적'))
## 4. 엑셀 파일 가져오기
# 패키지 설치 및 로딩
install.packages('readxl')
library(readxl)
data <- read_excel('student4.xlsx')
class(data) # [OUT] "tbl_df" "tbl" "data.frame" / 패키지에서 제공하는 데이터형식 추가됨
## 5. 엑셀 파일 내 시트 가져오기
exam_data <- read_excel('student4.xlsx', # 엑셀파일 명
sheet = 'Exam', # 시트 명
na = 'NULL') # 결측치 값
## 6. 엑셀 파일 내 특정 행/열 범위만 로딩
# 1) 모든 행 출력
homework_data <- read_excel('student4.xlsx',
sheet = 'Homework')
# 2) 특정 행 범위만 로딩
homework_data2 <- read_excel('student4.xlsx',
range = cell_rows(3:8), # 출력할 범위 지정
sheet = 'Homework')
print(homework_data2)
# 3) 특정 행/열 범위만 로딩 (range = R행번호C열번호 : R행번호C열번호)
homework_data3 <- read_excel('student4.xlsx',
range = 'R3C1:R8C4', # 출력할 범위 지정
sheet = 'Homework')
✅ 데이터 내보내기
- 텍스트 파일 : write.table(데이터 프레임 변수, 저장할 파일 명, row.name=TRUE, quote = TRUE, sep=“ ”)
- csv 파일 : write.csv(데이터 프레임 변수, 저장할 파일 명, row.name=TRUE, quote = TRUE)
- 엑셀 파일(패키지 설치) : write_xlsx(데이터 프레임 변수, path =저장할 파일 명)
# 1) write.table
write.table(data, # 데이터프레임 변수
'save1.txt', # 저장할 파일명
row.names = FALSE, # 행 번호 추가 여부
quote = FALSE) # 문자형에 쌍따옴표 추가 여부
# 2) write.csv
write.csv(data,
'save2.csv',
row.names = FALSE,
quote = FALSE)
# 3) write.excel
# 패키지 설치
install.packages('writexl')
library(writexl)
write_xlsx(homework_data2,
path = 'save3.xlsx') # 저장할 파일명
1.6 데이터 확인 및 조작
✅ 데이터 확인
dim | 데이터 차원 확인 |
length | 마지막 차원의 갯수 |
head | 앞쪽 6개 데이터 출력 |
tail | 뒤쪽 6개 데이터 출력 |
str | 데이터프레임 정보 (class, 크기, 미리보기값) |
names | 컬럼명 |
View | Rstudio 뷰어 창에서 데이터 확인 |
✅ 데이터 추출
- 특정 행/열 : 데이터프레임[행, 열]
- 특정 행 : 데이터프레임[행, ]
- 특정 열 : 데이터프레임[ , 열]
✅ 데이터 분석 함수
- table(컬럼명) : 벡터 내에서 데이터 값이 몇 번 등장했는지 체크 (범주형 데이터 분석에 적합함)
+) python의 value_counts()와 유사함
# 1. 데이터를 로딩하고 확인하기
data <- read.csv('TravelMode.csv')
head(data)
dim(data) # [OUT] 840 10
# 2. 실제 여행에 사용한 데이터로만 구성된 데이터셋 생성
choice <- data$choice
choice_yes_index <- which(choice == 'yes')
actual_data <- data[choice_yes_index, ]
head(actual_data)
# 3. x, individual, choice 컬럼은 필요 없으므로 제거
processed_data <- actual_data[, c(-1, -2, -4)]
head(processed_data)
str(processed_data) # 210개의 데이터, 7개의 컬럼
# 4. wait, vcost, travel, gcost, income 컬럼의 평균값 구하기
print(mean(processed_data$wait)) # [OUT] 25.00952
print(mean(processed_data$vcost)) # [OUT] 47.4
print(mean(processed_data$travel)) # [OUT] 430.8476
print(mean(processed_data$gcost)) # [OUT] 103.8238
print(mean(processed_data$income)) # [OUT] 34.54762
# 5. mode, size 컬럼을 table 함수를 사용하여 두 컬럼의 값을 분석
table(processed_data$mode)
table(processed_data$size)
# 6. 여행 시, 교통수단으로 버스를 사용한 비율
mode_table <- table(processed_data$mode)
mode_names <- names(mode_table)
mode_numeric <- as.numeric(mode_table)
bus_cnt <- mode_numeric[which(mode_names == 'bus')]
bus_rate <- (bus_cnt / sum(mode_numeric)) * 100
print(bus_rate) # [OUT] 14.28571
# 7. 1인 가구의 여행 비율
size_table <- table(processed_data$size)
size_names <- names(size_table)
size_numeric <- as.numeric(size_table)
solo_cnt <- size_numeric[which(size_names == '1')]
size_rate <- (solo_cnt / sum(size_numeric))*100
print(size_rate) # [OUT] 54.28571
2. 데이터 시각화
2.1 기본 그래프
✅ 산점도
x = c(1, 2, 3, 4, 5, 6)
y = c(2, 4, 5.8, 7, 7.5, 8)
plot(x, y, pch = 19) # pch : 점의 모양 (숫자: 1~25 , 문자:“*”, “%”, “#”, 등)
✅ 꺾은선 그래프 (다중 그래프)
- plot(x,y, type=‘p’, main=NULL, xlab=“”, ylab=“”, xlim=c(), ylim=c())
- legend(위치 값, legend=라벨 값, fill=색상 값)
→ 위치 값: “topright”, “topleft”, “top”, “bottom”, “bottomleft”, “bottomright”, “center”, “left”, “right”
# 1) 데이터 불러오기
library(datasets)
data <- as.numeric(AirPassengers)
length(data) # [OUT] 144
y1949 = data[1:12]
y1950 = data[13:24]
# 2) 그래프 그리기
plot(y1949,
type = 'o',
pch = 19,
col = 'red', # 그래프 색상
ylim = c(90, 180), # y축 범위
xlab = 'Month',
ylab = 'passengers')
# 3) 추가 데이터
lines(y1950, type = 'o', pch = 19, col = 'blue')
# 4) 범례
legend('topright', # 위치 값
legend = c('1949y', '1950y'), # 라벨 값
fill = c('red', 'blue')) # 색상 값
✅ 파이차트
- pie(data, label=“”, init.angle=0, radius=1)
research <- c('좋다', '그저 그렇다', '좋다', '좋다', '좋다', '좋다', '싫다', '그저 그렇다', '싫다')
result <- table(research)
pie(result) # 테이블 객체 삽입 시, 라벨이 자체적으로 붙음
✅ 히스토그램
- hist(data, breaks=NULL, frep=T)
→ frep = T : 횟수, frep = F : 비율
data <- airquality
head(data)
temp <- data$Temp
range(temp) # [OUT] 56, 97 (최솟값, 최댓값)
hist(data$Temp,
breaks = 20, # 범주 갯수
freq = F) # 결과 출력 값 기준 (T = 횟수, F = 비율)
✅ 박스플롯
boxplot(data)
✅ 화면 분할 - par() 함수
- par(mfrow = c(분할 화면 행 개수, 분할 화면 열 개수))
par(mfrow = c(1, 2))
data <- sample(100:150, 30)
hist(data)
hist(data, breaks = 20)
2.2 dplyr 패키지
✅ 설치
install.packages('dplyr')
library(dplyr)
✅ 주요 함수
함수 | 문법 | 설명 |
rename() | rename(data, 변경 후 컬럼명 = 기존 컬럼명, ...) | 특정 컬럼의 이름 변경 |
arrange() | arrange(data, desc(컬럼이름)) # default : 오름차순 | 특정 컬럼의 값을 기준으로 데이터 정렬 |
distinct() | distinct(data, 컬럼이름) | 특정 컬럼의 중복 값 제거 |
select() | select(dataframe, 컬럼명, ...) | 원하는 컬럼만 추출 |
filter() | filter(dataframe, 조건식) | 조건에 충족되는 행만 추출 |
mutate() | mutate(dataframe, 생성할 컬럼명 = 수식, ...) | 기존 컬럼값을 사용하여 새로운 컬럼 생성 |
group_by() | group_by(dataframe, 컬럼명) | 특정 컬럼 값이 같은 데이터를 그룹화 |
summarize() | summarize(dataframe, 컬럼명 = 계산식, ...) | 새로운 데이터프레임에 수행결과 통합 |
# 1) select(dataframe, 컬럼명, ...)
select(exam, science, english)
# 2) filter(dataframe, 조건식)
select_index <- exam$science >= 70 & exam$math < 50
print(exam[select_index, c('id')])
# 3) mutate(dataframe, 생성할 컬럼명 = 수식, ...)
mutate(exam, pass = ifelse((math + english + science) / 3 >= 70, '합격', '불합격'))
# 4) group_by(dataframe, 컬럼명)
# 5) summarize(dataframe, 컬럼명 = 계산식, ...)
group_exam <- group_by(exam2, examTerm)
summarize(group_exam, mathAvg = mean(math))
2.3 파이프 연산자
- dplyr 패키지의 핵심 연산자
- 앞에서 연산된 결과값이나 데이터를 다음으로 전달하는 역할
## 아래의 2개의 코드가 동일함
# 기본 R 함수
select_index <- exam$science >= 70 & exam$math < 50
print(exam[select_index, c('id')])
# dplyr 함수 (파이프 연산자)
exam %>% filter(science >= 70 & math < 50) %>% select(id) %>% as.character() %>% print()
2.4 실습 1
- 'gapminder'라는 내장 데이터를 활용하여 데이터 처리 및 시각화
# 1. 패키지 설치 및 로딩
install.packages('gapminder')
library(gapminder)
library(dplyr)
gapminder
# 2. 대륙 별 평균 GDP 계산
# pull() : tibble 자료형을 벡터 또는 데이터프레임 자료형으로 형 변환하는 함수
# 1) 기본 계산
mean(pull(gapminder[gapminder$continent == 'Africa', 'gdpPercap'])) # [OUT] 2193.755
mean(pull(gapminder[gapminder$continent == 'Americas', 'gdpPercap'])) # [OUT] 7136.11
mean(pull(gapminder[gapminder$continent == 'Asia', 'gdpPercap'])) # [OUT] 7902.15
mean(pull(gapminder[gapminder$continent == 'Europe', 'gdpPercap'])) # [OUT] 14469.48
mean(pull(gapminder[gapminder$continent == 'Oceania', 'gdpPercap'])) # [OUT] 18621.61
mean(pull(gapminder[gapminder$country == 'Korea, Rep.', 'gdpPercap'])) # [OUT] 8217.318
# 2) 파이프 연산자 활용 (filter, select 함수)
gapminder %>% filter(continent == 'Africa') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 2193.755
gapminder %>% filter(continent == 'Americas') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 7136.11
gapminder %>% filter(continent == 'Asia') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 7902.15
gapminder %>% filter(continent == 'Europe') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 14469.48
gapminder %>% filter(continent == 'Oceania') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 18621.61
gapminder %>% filter(country == 'Korea, Rep.') %>% select(gdpPercap) %>% pull() %>% mean() # [OUT] 8217.318
# 3. 대륙별 평균 GDP 테이블 생성
gdp_by_continents <- gapminder %>% group_by(continent) %>% summarize(mean_gdpPercap = mean(gdpPercap))
print(gdp_by_continents)
# 4. 아메리카 대륙에 대한 데이터프레임을 구하고, 몇 개의 행이 있는지 확인
America <- gapminder %>% filter(continent == 'Americas')
America %>% nrow() # [OUT] 300
# 5. 아메리카 대륙 인구가 3천만 이상인 데이터프레임 구하고, 해당 데이터프레임의 'country' 컬럼 별 행 갯수 구하기
# count(data, 컬럼명, sort = F)
America %>% filter(pop >= 30000000) %>% count(country, sort = T)
# 6. Brazil, Mexico, United States의 년도 별 인구수를 한 그래프에 나타내기
# 1) min, max 계산
min <- gapminder %>% filter(country == 'Brazil' | country == 'Mexico' | country == 'United States') %>% select(pop) %>% min() # [OUT] 30144317
max <- gapminder %>% filter(country == 'Brazil' | country == 'Mexico' | country == 'United States') %>% select(pop) %>% max() # [OUT] 301139947
print(min)
print(max)
# 2) 그래프 그리기
gapminder %>% filter(country == 'Brazil') %>% select(year, pop) %>% plot(type = 'o', col = 'red', ylim = c(min, max))
gapminder %>% filter(country == 'Mexico') %>% select(year, pop) %>% lines(type = 'o', col = 'blue')
gapminder %>% filter(country == 'United States') %>% select(year, pop) %>% lines(type = 'o', col = 'green')
# 3) 범례 그리기
legend('topleft', legend = c('Brazil', 'Mexico', 'United States'),fill = c('red', 'blue', 'green'))
2.5 실습 2
- TravelMode 데이터를 활용하여 데이터 처리 및 시각화
library(dplyr)
## 1. 데이터 로딩 및 확인
data <- read.csv('TravelMode.csv')
head(data)
dim(data)
## 2. 교통수단 별 총 비용의 평균 값
data %>% group_by(mode) %>% summarize(gcostAgv = mean(gcost))
## 3. 교통수단 별 총 비용의 평균 값을 파이차트로 그리기
# 1) 2번에서 구한 값을 데이터프레임으로 만들기
avg_table <- data %>% group_by(mode) %>% summarize(gcostAgv = mean(gcost))
avg_table <- avg_table %>% as.data.frame()
# 2) 라벨 생성
label <- paste(avg_table$mode, "(", round((avg_table$gcostAgv / sum(avg_table$gcostAgv))*100, 1), "%", ")", sep = '')
# 3) 파이차트 그리기
pie(avg_table$gcostAgv, labels = label)
3. 멘토링
오늘도 R의 문법에 대해 간략하게 설명을 듣고 예제를 함께 풀어봤다.
✅ 데이터프레임에서 데이터 추출하기
- 데이터 추출하기 : 데이터프레임[특정 행, 특정 열]
- 데이터에 결측치가 있으면 통계값이 계산되지 않기 때문에 결측치를 처리하거나 결측치를 제외한 데이터를 계산해야 한다.
→ na.rm = T : 결측치를 제외하고 평균값을 출력
- 결측치 갯수 확인 : is.na(컬럼명)
data <- airquality
str(data)
head(data)
# Month별 데이터 수
table(data$Month)
# 7월 모든 데이터
data[which(data$Month == 7), ]
# 7월 31일 데이터
data[which((data$Month == 7) &(data$Day == 31)), ]
# 7월 31일 Ozone, Solar.R
data[which((data$Month == 7) &(data$Day == 31)), c('Ozone', 'Solar.R')]
data[which((data$Month == 7) &(data$Day == 31)), c(1, 2)]
# 7월 데이터를 data7 데이터프레임으로 만들고 7월 Ozone 평균 구하기
data7 <- data[which(data$Month == 7), ]
data7
mean(data7$Ozone) # [OUT] NA (데이터에 결측치가 있기 때문)
mean(data7$Ozone, na.rm = T) # [OUT] 59.11538 (na.rm = T : 결측치를 제외하고 평균값을 출력)
# 7월 Ozone 결측치 갯수 확인(함수중첩)
sum(is.na(data7$Ozone)) # [OUT] 5
# 7월 Ozone 결측치 갯수 확인(dplyr 파이프연산자 사용)
library('dplyr')
data7$Ozone %>% is.na() %>% sum()
4. 회고
R의 기능이 파이썬과 유사하고, 문법도 비슷해서 조금씩 헷갈리기 시작했다.
R에 대해서 모르는 상황에서 배우려고 하니 쉽지는 않았다. 그래도 멘토링 시간에 강사님께서 중요한 문법들 위주로 다시 알려주시고 같이 예제를 풀어봐서 더 머릿속에 남았다.
내일이 R 교육 마지막인데, 마무리 잘 해봐야겠다. :)
'웅진X유데미 STARTERS > TIL (Today I Learned)' 카테고리의 다른 글
[스타터스 TIL] 14일차.데이터 드리븐 디자인씽킹 (1) (0) | 2023.02.24 |
---|---|
[스타터스 TIL] 13일차.기초부터 익히는 R (3) - ggplot2, 텍스트 마이닝, 단계 구분도, 통계분석 (0) | 2023.02.23 |
[스타터스 TIL] 11일차.기초부터 익히는 R (1) - R 자료 구조, 변수, 함수, 패키지 (0) | 2023.02.20 |
[스타터스 TIL] 10일차.SQL을 통한 데이터활용과 분석 (3) - 집계함수, 순위함수, 실습 (0) | 2023.02.17 |
[스타터스 TIL] 9일차.SQL을 통한 데이터활용과 분석 (2) - 기본 문법 (0) | 2023.02.16 |