[R] 데이터 정리 (tidyr, dplyr / gather, separate, spread, filter)와 pipeline(%>%)

 

 

유튜브 datasciencelim 님의 R 프로그램 강의 내용을 토대로

통계 프로그램 R 기초 내용 정리합니다.


데이터 정리를 위한 패키지(tidyr, dplyr) 설치

✔︎ install.packages("tidyr")
✔︎ install.packages("dplyr")

 

이후에는 아래와 같이 써주면 된다.

✔︎ library(tidyr)
✔︎ library(dplyr)


X <- data.frame (ⓐ=c(1,2,3),

                                 ⓑ=c("a","b","g"), ⓒ=c(30,40,23),

                                 ⓓ=c("d","e","f"), ⓔ=c(44,53,25))                

X <- data.frame(family=c(1,2,3),
                  namef=c("a","b","g"), agef=c(30,40,23),
                  namem=c("d","e","f"), agem=c(44,53,25))

# 결과
> X
   family namef agef namem agem
1      1     a   30     d   44
2      2     b   40     e   53
3      3     g   23     f   25

 

 

✔︎ gather(X, key, value, ⓑ:ⓔ)

     : X 데이터셋을 keyvalue 항목으로

       ⓐ기준으로 ⓑ~를 세로로 긴 표로 정리

Y <- gather (X, key, value, namef:agem)

# 결과
> Y
   family   key value
1       1 namef     a
2       2 namef     b
3       3 namef     g
4       1  agef    30
5       2  agef    40
6       3  agef    23
7       1 namem     d
8       2 namem     e
9       3 namem     f
10      1  agem    44
11      2  agem    53
12      3  agem    25

 

 

✔︎ separate(Y, key, c("A", "B"), -1)

     : Y 데이터셋의 key을 값을  AB로 나누는데,

       key값의 뒤에서 첫번째 기준으로 

Z <- separate (Y, key, c("variable","type"),-1)

# 결과
> Z
   family variable type value
1       1     name    f     a
2       2     name    f     b
3       3     name    f     g
4       1      age    f    30
5       2      age    f    40
6       3      age    f    23
7       1     name    m     d
8       2     name    m     e
9       3     name    m     f
10      1      age    m    44
11      2      age    m    53
12      3      age    m    25

 

 

✔︎ spread(Z, A, value)

     : Z 데이터셋을 분리된 A항목으로 나눠

new <- spread (Z,variable,value)

# 결과
> new
  family type age name
1      1    f  30    a
2      1    m  44    d
3      2    f  40    b
4      2    m  53    e
5      3    f  23    g
6      3    m  25    f

 

 

✔︎ filter(new, B=="x")

     : new 데이터셋에서 Bx 인 것만 분류

filter(new, type=="f")

# 결과
  family type age name
1      1    f  30    a
2      2    f  40    b
3      3    f  23    g

 

 

✔︎ filter(new, age>=40)

     : new 데이터셋에서 age40 이상인 것만 분류

filter(new, age>=40)

# 결과
  family type age name
1      1    m  44    d
2      2    f  40    b
3      2    m  53    e

 


 

매번 새로운 데이터셋 정의하는 것이 귀찮으므로

pipeline (%>%) 사용 (위부터 순차적으로 진행)

 

X

new <- X %>%

               gather(key, value, :ⓔ) %>%

               separate(key, c("A", "B"), -1) %>%

               spread(A, value)

new2 <- member %>%
        gather (key, value, namef:agem) %>%
        separate (key, c("variable","type"),-1) %>%
        spread (variable,value)

# 결과
> new2  
  family type age name
1      1    f  30    a
2      1    m  44    d
3      2    f  40    b
4      2    m  53    e
5      3    f  23    g
6      3    m  25    f