study blog

reshape2 패키지로 데이터 형태 변환 본문

R/3. 데이터 조작

reshape2 패키지로 데이터 형태 변환

ivo_lee 2020. 1. 15. 09:09

 reshape2 패키지로 데이터 형태 변환

- 데이터의 형태를 바꿀 수 있음 -> 가로로 되어있는 데이터를 세로로 바꿀 수 있어요!

- 컬럼으로 저장되어 있는 데이터를 row 형태로 / row 형태의 데이터를 column형태로 전환

 

 

실습을 통해 이해해보자! (melt_mpg.csv, sample_mpg.csv)

library(ggplot2)
library(stringr)
library(dplyr)

sample_mpg <- read.csv(file="C:/R_lecture/data/sample_mpg.csv",
                       sep=",", header=T,      # 둘 다 default값
                       fileEncoding="UTF-8")   # 한글 사용할 때는 꼭 써줘야 함!

melt_sample_mpg <- read.csv(file="C:/R_lecture/data/melt_mpg.csv",
                            sep=",", header=T,      
                            fileEncoding="UTF-8")

 

[연습문제] 두 개의 data frame 각각에 대해서 평균 도시 연비 구하기

# 방법1
mean(melt_sample_mpg$value[melt_sample_mpg$variable=="cty"])

# 방법2
mean(sample_mpg$cty)  #18.25

# 방법3
melt_sample_mpg %>%
filter(variable==”cty”) %>%
summarise(avg_rate=mean(value))  #18.25

 

[연습문제] 두 개의 data frame에 대해서 평균 연비를 구해서 표시 (평균연비=도시연비,고속도로연비 평균)

# sample_mpg의 평균 연비 구하기

sample_mpg %>%
  mutate(avg_rate=(cty+hwy)/2)  #각 칼럼의 평균 나올 것!

# melt_sample_mpg의 평균 연비 구하기

구현 자체가 매우 힘듦! -> reshape2 패키지 이용하여 데이터프레임의 형태를 바꿔보자.

 

# 형태를 바꾸는 패키지 : reshape2

- 수집한 데이터를 분석하기 편한 형태로 가공할 때 사용하는 대표적인 패키지

- reshape2에서는 2개의 함수만 잘 알아두면 됨!

 

1) melt()

- melt(데이터프레임, id.vars=”녹이지 않을 열”,measure.vars=”녹일 열”)

- column row형태로 바꾸어서 가로로 긴 데이터를 세로로 길게 변환하는 함수

- melt()의 기본동작은 numeric을 포함하고 있는 모든 column row로 변환함

- 간단한 예를 통해서 melt()의 동작방식을 알아보자!

install.packages("reshape2");  library(reshape2)
ls(airquality)       # 컬럼명
df<- airquality     # 153행, 6열
melt(df)           # id없이 생성. 모든 numeric들을 다 이용해서 melt함  #153*6 =918행
nrow(melt(df,na.rm=T))  # 결측치 제외 -> 874행

melt(df, id.vars="Month")       # id.vars: 녹이지 말아야 할 열.   # 153*5 = 765행
melt(df, id.vars=c("Month","Day"))  # 153*4 = 612행
melt_df <- melt(df,
                id.vars=c("Month","Day"),
                measure.vars="Ozone",     # measure.vars: 녹일 열
                variable.name="Item",     # 열의 이름 변경할 수 있음   
                value.name = "Item_value")

 

2) dcast() : data frame에 대한 cast 작업. row로 되어 있는 데이터를 column형태로 전환

                일반적으로 많이 사용. reshape2를 이용하는 이유.

 

cf) acast() : 벡터 다룰 때    # melt후 겹치는 데이터 있는 경우 다시 cast하기 어려움.

 

dcast(melt_df,

     formula=Month~Item,    # 복구시킨 데이터프레임에 있어야 하는 것들~melt된 열

                #Month~…        # 이렇게 쓰는 것도 가능  (...: 나머지 다라는 의미)

      fun=mean,                   # 집계함수를 이용한 데이터 프레임 구성.

      na.rm=T)               

 

# 처음에 받은 csv 파일의 내용을 dcast를 이용하여 복구시켜보자.

 

dcast(melt_sample_mpg,
      formula=manufacturer+model+class+trans+year~variable, 
      value.var= "value")   # melt된 데이터 값 여기에 있다.

결과: 오류 Aggregation function missing: defaulting to length (원래 있던 컬럼들이 유니크하지 않아서 문제)

→ melt_sample_mpg에서 우리가 합칠 variable,value를 제외한 값들이 유니크해야하는데 동일한게 존재해서 제대로 복구시킬 수 없다.

 

# melt를 복구하는 dcast 연습을 하기 위해 melt된 데이터를 생성해 보자!

# mpg를 가지고 melt data set을 생성해 보자.

df <- as.data.frame(mpg);   head(df)

audi_df <- df %>%
            filter(manufacturer=="audi"& model=="a4")

melt_audi_df <- melt(audi_df,
                     id.vars=c("manufacturer","model","year","cyl","trans"),
                     measure.vars=c("displ","cty","hwy"))

# dcast 실행해 보자.

dcast(melt_audi_df,
      formula=manufacturer+model+year+cyl+trans~variable,
      value.var="value")
Comments