데이터프레임과 데이터테이블의 차이를 알아보자

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()) 형태로 했는데, 완전히 다른 느낌이라서 쬐에끔 난항을 겪었다.