install.packages("tidyr") # 정리할 때 좋은 패키지
install.packages("dplyr")# 자료를 빨리 찾아볼 때 좋은 패키지 (필터링 패키지)


library(dplyr)

# 데이터 준비
# 3가족이 사는데, f여자, m남자에 대한 이름과 나이 정보

member = data.frame(family = c(1, 2, 3),
                     namef  = c("a", "b", "c"),
                     agef   = c(30, 40, 23),
                     namem  = c("d", "e","f"),
                     agem   = c(44, 53, 25))
member
# data.frame의 현재형태는 각 가족에 대해서 보기 편할 수 도 있다.
# 예를 들어, 1번 가족에 a(30세), d(44세)가 있다. 이런식이다.
# 하지만, 데이터 분석에 있어서는 안좋다.
# 예를 들어, 여자멤버는 누가 있고, 나이에 따른 분포 등을 알기 어렵다
# 즉, 그래프를 그리기 쉽지 않다.

image


### 문제 : 데이터에서 namef, namem이 아닌 f/m를 따로 표시해서 알아보기 ###

#### 1. tidyr(타이디 r)을 이용해서 정리하기 ####
library(tidyr)
#### ...L 1) gather() ####
# 여러칼럼들을 칼럼들을 --> 1개의 칼럼key - value 값을 형태로 모아주는 함수
# gather( df, key*칼럼명 모을칼럼명, value*모을값의 칼럼명, 식별칼럼제외 모을 칼럼범위a:b)
# *** 이 때, 식별칼럼에 해당하는 family칼럼은 제외하고 모아준다. 만약 식별칼럼까지 모아버리면, 모으기전 같은 라인에 있던 이름-나이 의 연관성이 사라져버린다.

# *** reshape2패키지의 melt()와 매우 유사함.(http://nittaku.tistory.com/349)
# gather(membe(df), key(칼럼명모은 칼럼명), value(값 모은 칼럼명), family:agem) : 식별칼럼family까지 모으면, 모이기전의 값들이 연관성이 없어져버린다.
# ex> 1-namef-a / 1-agef-30 ==> namef-a 와 agef-30의 이름과 나이의 연관성이 사라져버림
gather(member, key, value, namef:agem)
a <- gather(member, key, value, namef:agem)
image

#### ...L 2) separate() ####
# 특정 칼럼의 값 -> 2개로 쪼개면서 2개의 칼럼 생성
# - gater로 모아진 데이터를 이용해서, 특정칼럼의 값을 쪼갠다.
# separte(값을 쪼갤df, 쪼갤칼럼명, c("쪼갠칼럼1", "쪼갠칼럼2"), 쪼갠위치)
b <- separate(a, key, c("variable", "type"), -1) # 뒤에서

image

#### ...L 3) spread() ####
# key-value형태의 칼럼을 --> key값을 기준으로 여러칼럼으로 생성 + value은 각각에 따라붙음
# ***reshape2의 dcast()와 비슷한 듯 : http://nittaku.tistory.com/349
# 여러칼럼들을 모아서 필요한 처리이후, 다시 name과 age를 분리하기
# spread(칼럼명/ 값 칼럼을 <칼럼명의 값의 이름으로> 2개칼럼으로 나눌df, 나눌 칼럼명, 따라붙을 값 칼럼)
new <- spread(b, variable, value)
image

### *** my) gather()와 spread()는 값은 따라이동하기만 하고, 칼럼을 뭉치고/나눈다. ***


#### 2. dplyr패키지의 filter()함수로 여자만 필터링하기 ####
## dyplr패키지의 filter함수는 벡터연산의 [df$칼럼명 , ]과 달리
## filter(df, 칼럼명 == )으로 바로 인덱싱 but 자동완성x http://nittaku.tistory.com/352
filter(new, type == "f")
filter(new, age >= 30)

image


#### 3. 만약, tidyr로 정리한 데이터가 아니라면?  ####
# (1) select( df, 가져올칼럼1, 가져올칼럼2, 가져올칼럼3)함수를 통해,
#     df에서 f붙은 특정칼럼들만 가져온다.
select(member, family, namef, agef)
# (2) 벡터연산[,]을 통해 열만 인덱싱해준다.
member[,c("family", "namef", "agef")]
# 그러나 특정나이 이상인 모든 사람들을 가져오게할 때.. 쉽지가 않다.
# agef, agem 칼럼이 2개이기 때문...
image


#### 4. 파이프라인(%>%)을 통한 tidyr 함수3개 연속 사용하기 ####
# 파이프라인을 사용할 때는, 아래와 같은 형식이며
# 각 함수에서 df는 생략된다.

new2 <- member %>%
         gather(key, value, namef:agem) %>%              #칼럼들을 key-value로뭉치기
         separate(key, c("variable", "type"), -1) %>%    #값을 2개 칼럼으로 나누기
         spread(variable, value)                         #key-value를 key값별로 칼럼나누
new2

image

+ Recent posts