웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 12일차.기초부터 익히는 R (2) - R 연산자, 조건문, 반복문, 함수, 시각화

라밍쏭 2023. 2. 21. 18:58
728x90


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 번"

 

▼ 💡 실습 💡▼

더보기
https://www.airport.co.kr/www/cms/frFlightStatsCon/domesticLineStats.do?MENU_ID=1250#none

- 운항이 평균 실적보다 높은 항공사들을 벡터 형태로 출력

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 패키지의 핵심 연산자

- 앞에서 연산된 결과값이나 데이터를 다음으로 전달하는 역할

 

https://thebook.io/080217/ch07/01/02/

## 아래의 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 교육 마지막인데, 마무리 잘 해봐야겠다. :)

 

 

728x90