데이터프레임과 데이터테이블의 차이를 알아보자
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(data.table)
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
frame_iris<-as.data.frame(iris)
table_iris<-as.data.table(iris)
iris데이터를 각각 데이터프레임과 데이터테이블로 불러온다.
is.data.frame(frame_iris)
## [1] TRUE
is.data.table(table_iris)
## [1] TRUE
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
여기서 알아둘 것은 frame_iris는 데이터프레임이자 데이터테이블이다.
iris데이터 자체가 data.frame형태로 되어있기 때문.
코드는 다르지만 모두 같은 결과물이 나온다.
#평균값 구하기
frame_iris %>%
summarise(mean(Sepal.Length))
## mean(Sepal.Length)
## 1 5.843333
table_iris[,mean(Sepal.Length)]
## [1] 5.843333
평균값을 구하는 것도 코드의 형태는 다르지만, 결과값은 같다.
#dplyr의 filter와 summarise 다른 코드, 같은 결과물.
frame_iris %>%
filter(Species=="setosa") %>%
summarise(mean_sepal.Length=mean(Sepal.Length))
## mean_sepal.Length
## 1 5.006
table_iris[Species=="setosa", .(mean_sepal.Length=mean(Sepal.Length))]
## mean_sepal.Length
## 1: 5.006
#group_by써보기
frame_iris %>%
group_by(Species) %>%
summarise(mean_sepal.Length=mean(Sepal.Length))
## # A tibble: 3 x 2
## Species mean_sepal.Length
## <fct> <dbl>
## 1 setosa 5.01
## 2 versicolor 5.94
## 3 virginica 6.59
table_iris[, .(mean_sepal.Length=mean(Sepal.Length)), by=Species]
## Species mean_sepal.Length
## 1: setosa 5.006
## 2: versicolor 5.936
## 3: virginica 6.588
dplyr에서 group_by를 통해 그룹별로 묶을 수 있는 코드가 data.table에서는 by로 묶는다.
#정렬 해보기
frame_iris %>%
group_by(Species) %>%
summarise(mean_sepal.Length=mean(Sepal.Length)) %>%
arrange(desc(mean_sepal.Length))
## # A tibble: 3 x 2
## Species mean_sepal.Length
## <fct> <dbl>
## 1 virginica 6.59
## 2 versicolor 5.94
## 3 setosa 5.01
table_iris[, .(mean_sepal.Length=mean(Sepal.Length)), by=Species][order(-mean_sepal.Length)]
## Species mean_sepal.Length
## 1: virginica 6.588
## 2: versicolor 5.936
## 3: setosa 5.006
정렬하는게 은근히 헷갈리는게 슬슬 [][] 이 형태로 묶이다보니깐 살살 헷갈리고 order로 한다. dplyr에서는 arrange(desc()) 형태로 했는데, 완전히 다른 느낌이라서 쬐에끔 난항을 겪었다.