Notes
# csv 파일을 읽어서 데이터 프레임을 생성
> exam <- read.csv("data/csv_exam.csv")
# 데이터 프레임을 출력
> exam
# 데이터 프레임은 테이블. 모든 행과 열에는 자동으로 번호가 부여됨
> exam[7,2] # 데이터 프레임[행번호,열번호]
[1] 2
> exam[1, ] #행(가로) 또는 열(세로) 번호를 생략하면 해당 행이나 열을 전체 출력해줌.
id class math english science
1 1 1 50 98 50
#여러개의 행/열을 한번에 추출
> exam[1:2,]
id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
> exam[3:5,4:5]
english science
3 86 78
4 98 58
5 80 65
> exam[ seq(1,20,4) , 3:5 ]
math english science
1 50 98 50
5 25 80 65
9 20 98 15
13 46 98 65
17 65 68 98
> exam[ c(1,10,20) , ]
id class math english science
1 1 1 50 98 50
10 10 3 50 98 45
20 20 5 78 83 58
#논리값
> exam$class==2
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#논리값(True, False)으로 데이터를 추출
> exam[exam$class == 1, ]
id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
# & = and , | or
> exam[(exam$class == 1) | (exam$class == 2),]
id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
5 5 2 25 80 65
6 6 2 50 89 98
7 7 2 80 90 45
8 8 2 90 78 25
# %in% 연산자
> exam[exam$class %in% c(3,4),]
id class math english science
9 9 3 20 98 15
10 10 3 50 98 45
11 11 3 65 65 65
12 12 3 45 85 32
13 13 4 46 98 65
14 14 4 48 87 12
15 15 4 75 56 78
16 16 4 58 98 65
# 수학 점수가 50점 이상인 학생들의 id, class, math 출력
> exam[(exam$math>=80),c(1,2,3)]
id class math
7 7 2 80
8 8 2 90
18 18 5 80
19 19 5 89
# 컬럼 이름이 있는 경우 데이터 추출 --> " " 큰따옴표로 combine 함수 안에 문자 입력
# 과학 점수가 60점 이상인 학생들의 id, class, science 출력
> exam[exam$science > 80,c("id","class","science")]
id class science
6 6 2 98
17 17 5 98
18 18 5 90
19 19 5 87
# 모델명이 sonata인 자동차의 정보 출력 --> 큰따옴표로 검색
> mpg[mpg$model=="sonata",]
manufacturer model displ year cyl trans drv cty hwy fl class
109 hyundai sonata 2.4 1999 4 auto(l4) f 18 26 r midsize
110 hyundai sonata 2.4 1999 4 manual(m5) f 18 27 r midsize
111 hyundai sonata 2.4 2008 4 auto(l4) f 21 30 r midsize
112 hyundai sonata 2.4 2008 4 manual(m5) f 21 31 r midsize
113 hyundai sonata 2.5 1999 6 auto(l4) f 18 26 r midsize
114 hyundai sonata 2.5 1999 6 manual(m5) f 18 26 r midsize
115 hyundai sonata 3.3 2008 6 auto(l5) f 19 28 r midsize
utils, base ... : 패키지 이름
# 1반(class ==1) 학생들의 모든 정보 출력
> filter(exam,class==1)
id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
# dplyr 패키지의 모든 함수는 첫번째 파라미터가 데이터 프레임.
# 변수 이름들은 데이터 프레임 이름을 생략하고 사용하면 됨.
filter(exam, class==1|class==2)
filter(exam, class %in% c(1,2))
filter(exam, class %in% 1:2)
# dplyr 패키지의 함수들을 호출하는 방법
1) function(data_frame, 다른 파라미터들...)
2) data_frame %>% function ( 파라미터들... ) %>% 파이프 연산자 : Ctrl + Shift + M
exam %>% filter (class==1) # ctrl+space 했을 때 컬럼이름이 보인다
연습문제
mpg 데이터를 이용해 분석 문제를 해결해 보세요.
mpg <- as.data.frame(ggplot2::mpg)
str(mpg)
ex11 = mpg %>% filter(displ<=4)
ex12= mpg %>% filter(displ>5)
> mean(ex11$hwy)
[1] 25.96319
> mean(ex12$hwy)
[1] 18.13889
ex21= mpg %>% filter(manufacturer=="audi")
ex22= mpg %>% filter(manufacturer=="toyota")
> mean(ex21$cty)
[1] 17.61111
> mean(ex22$cty)
[1] 18.52941
ex31= mpg %>% filter(manufacturer=="chevrolet")
ex32= mpg %>% filter(manufacturer=="ford")
ex33= mpg %>% filter(manufacturer=='honda')
> mean(ex31$hwy)
[1] 21.89474
> mean(ex32$hwy)
[1] 19.36
> mean(ex33$hwy)
[1] 32.55556
# 1) select (data_frame, columns)
# 2) data_frame %>% select(columns)
#exam 데이터 프레임에서 수학 점수만 선택!
>exam %>% select(math)
math
1 50
2 60
3 45
4 30
5 25
# id와 math 변수를 선택
> exam %>% select(math,id)
math id
1 50 1
2 60 2
3 45 3
4 30 4
5 25 5
# class 변수를 제외한 모든 변수를 선택!
> exam %>% select(-class)
id math english science
1 1 50 98 50
2 2 60 97 60
3 3 45 86 78
4 4 30 98 58
5 5 25 80 65
#1) 1반 학생들만 있는 데이터 프레임
exam %>%
filter(class==1) %>% %>%는 반드시 문장 끝에 붙어야 한다
select(id, math)
1 1 50
2 2 60
3 3 45
4 4 30
# math, english, science 를 출력, 앞에 있는 6건만 출력
exam %>%
select(math,english,science) %>%
head() 순서를 바꿔도 상관 없음. head를 먼저 하는게 바람직
1 50 98 50
2 60 97 60
3 45 86 78
4 30 98 58
5 25 80 65
6 50 89 98
# 정렬: dplyr::arrange(data_frame, 정렬 기준 컬럼들)
exam %>% arrange(math) # 정렬의 디폴트 : 오름차순
# 내림차순 정렬을 할 때는 desc() 함수 이용
exam %>% arrange(desc(math))
# 두 개 이상의 변수로 정렬
# class 순서 -> math 점수 순서
> exam %>% arrange(class,desc(math))
id class math english science
1 2 1 60 97 60
2 1 1 50 98 50
3 3 1 45 86 78
4 4 1 30 98 58
5 8 2 90 78 25
6 7 2 80 90 45
7 6 2 50 89 98
8 5 2 25 80 65
9 11 3 65 65 65
10 10 3 50 98 45
11 12 3 45 85 32
12 9 3 20 98 15
13 15 4 75 56 78
14 16 4 58 98 65
15 14 4 48 87 12
16 13 4 46 98 65
17 19 5 89 68 87
18 18 5 80 78 90
19 20 5 78 83 58
20 17 5 65 68 98
"audi"에서 생산한 자동차 중에 어떤 자동차 모델의 hwy(고속도로 연비)가 높은지 알아보려고 합니다. "audi"에서 생산한 자동차 중 hwy가 1~5위에 해당하는 자동차의 데이터를 출력하세요.
mpg %>% filter(manufacturer=="audi") %>% arrange(desc(hwy)) %>% head( n=5 )
# data_frame$new_var = 식; --> 데이터 프레임이 변경됨
exam2 = exam
exam2$total = exam2$math + exam2$english + exam2$science
# 원본 데이터 프레임은 수정되지 않고, 새로운 컬럼이 추가된 데이터 프레임이 리턴된다.
exam %>% mutate(total=math+english+science)
# 3과목 모두 50점 이상이고, 세 과목 평균이 60점 이상이면 pass , 그렇지 않으면 fail
exam %>% mutate(avg=round((science+math+english)/3),
test= ifelse(avg>=60 & science>50 &english>50&math>50, 'pass','failed'))
mpg 데이터를 이용해서 분석 문제를 해결해보세요.
mpg 데이터는 연비를 나타내는 변수가 hwy(고속도로 연비), cty(도시 연비) 두 종류로 분리되어 있습니다.
두 변수를 각각 활용하는 대신 하나의 통합 연비 변수를 만들어 분석하려고 합니다.
Q1. mpg 데이터 복사본을 만들고, cty 와 hwy 를 더한 '합산 연비 변수'를 추가하세요.
Q2. 앞에서 만든 '합산 연비 변수'를 2 로 나눠 '평균 연비 변수'를 추가세요.
Q3. '평균 연비 변수'가 가장 높은 자동차 3 종의 데이터를 출력하세요.
Q4. 1~3 번 문제를 해결할 수 있는 하나로 연결된 dplyr 구문을 만들어 출력하세요. 데이터는 복사본 대신 mpg 원본을 이용하세요.
as.data.frame(ggplot2::mpg)
mpg %>% mutate(totaly=cty+hwy, avgy=totaly/3) %>% arrange(desc(avgy)) %>% head(n=3)
> # dplyr::summerise()
> # dplyr::summerize()
# 벡터를 스칼라로 만들어줌 !!
> exam %>% summarise(column.title=mean(math))
column.title
1 57.45
> exam %>% summarise(mean=mean(math), sd = sd(math))
mean sd
1 57.45 20.29901
# 반별로 수학 점수의 평균 출력
> exam %>% group_by(class) %>%
summarise(mean(math),mean(english),mean(science))
# A tibble: 5 x 4
class `mean(math)` `mean(english)` `mean(science)`
<int> <dbl> <dbl> <dbl>
1 1 46.2 94.8 61.5
2 2 61.2 84.2 58.2
3 3 45 86.5 39.2
4 4 56.8 84.8 55
5 5 78 74.2 83.2
함수 의미 : mean() 평균, sd() 표준편차, sum() 합계, median() 중앙값, min() 최솟값, max() 최댓값, n() 빈도
summarise, filter, mutate 함수 안에서 사용
> exam %>% group_by(class) %>% summarise(num.of.student=n())
# A tibble: 5 x 2
class num.of.student
<int> <int>
1 1 4
2 2 4
3 3 4
4 4 4
5 5 4
#1
mpg %>%
group_by(class) %>%
summarise(ctymean=mean(cty))
# A tibble: 7 x 2
class ctymean
<chr> <dbl>
1 2seater 15.4
2 compact 20.1
3 midsize 18.8
4 minivan 15.8
5 pickup 13
6 subcompact 20.4
7 suv 13.5
#2
mpg %>%
group_by(class) %>%
summarise(ctymean=mean(cty)) %>%
arrange(desc(ctymean))
# A tibble: 7 x 2
class ctymean
<chr> <dbl>
1 subcompact 20.4
2 compact 20.1
3 midsize 18.8
4 minivan 15.8
5 2seater 15.4
6 suv 13.5
7 pickup 13
#3
mpg %>%
group_by(manufacturer) %>%
summarise(hwymean=mean(hwy)) %>%
arrange(desc(hwymean)) %>%
head(3)
# A tibble: 3 x 2
manufacturer hwymean
<chr> <dbl>
1 honda 32.6
2 volkswagen 29.2
3 hyundai 26.9
#4
mpg %>%
filter(class=='compact') %>%
select(manufacturer, class) %>%
group_by(manufacturer) %>%
summarise(n=n()) %>%
arrange(desc(n))
# A tibble: 5 x 2
manufacturer n
<chr> <int>
1 audi 15
2 volkswagen 14
3 toyota 12
4 subaru 4
5 nissan 2