59doit

[ R ]reshape2 패키지 활용 본문

Programming/R

[ R ]reshape2 패키지 활용

yul_S2 2022. 11. 20. 09:02
반응형

reshape2 

  • reshape패키지의 기본 골격만을 대상으로 개발된 패키지
  • melt()함수와 dcast/acast()함수를 적용하여 집단변수를 통해서 데이터의구조를 유연하게 변경해주는 기능을 제공

 

(1) 긴 형식을 넓은 형식으로 변경

  • dcast()함수: 긴 형식(Long format)의 데이터를 넓은 형식(Wide format)으로 변경

 

ex ) reshape2 패키지 설치와 데이터 가져오기

 

data.csv
0.00MB

 

 

 

install.packages("reshape2")
library(reshape2)
data <- read.csv("C:/data.csv")
data
# Date Customer_ID Buy
# 1  20150101           1   3
# 2  20150101           2   4
# 3  20150102           1   2
# 4  20150101           2   3
# 5  20150101           1   2
# 6  20150103           2   3
# 7  20150102           4   6
# 8  20150102           5   1
# 9  20150103           1   5
# 10 20150103           2   1
# 11 20150103           4   8
# 12 20150107           3   4
# 13 20150107           5   3
# 14 20150103           5   5
# 15 20150104           1   5
# 16 20150104           2   8
# 17 20150104           3   5
# 18 20150105           5   6
# 19 20150106           2   6
# 20 20150106           3   6
# 21 20150107           1   9
# 22 20150107           5   7

 

 

ex ) 넓은 형식(wide format)으로 변경

wide <- dcast(data, Customer_ID ~ Date, sum)
wide
# Customer_ID 20150101 20150102 20150103 20150104 20150105 20150106 20150107
# 1           1        5        2        5        5        0        0        9
# 2           2        7        0        4        8        0        6        0
# 3           3        0        0        0        5        0        6        4
# 4           4        0        6        8        0        0        0        0
# 5           5        0        1        5        0        6        0       10
  • 앞변수(Customer_ID)는 행으로 구성 
  • 뒷변수(Date)는 열로 구성
  • Buy변수는 측정변수로 사용
  • dcast(데이터셋, 앞변수 ~뒤변수, 적용함수)

 

 

 

ex ) 파일 저장 및 읽기

wide.csv
0.00MB

 

 

  • row.names=FALSE 속성을 이용하여 행 번호 없이 저장
write.csv(wide, "wide.csv", row.names = FALSE)
wide <- read.csv("wide.csv")
colnames(wide) <- c('Customer_ID', 'day1', 'day2', 'day3', 'day4', 'day5', 'day6', 'day7')

wide
# Customer_ID day1 day2 day3 day4 day5 day6 day7  NA
# 1           1    3    2    5    5    0    0    9  25
# 2           2    4    0    1    8    0    6    0  21
# 3           3    0    0    0    5    0    6    0  14
# 4           4    0    6    8    0    0    0    0  18
# 5           5    0    1    5    0    6    0    7  24
# 6  Sum by day    7    9   19   18    6   12   16 102

 

 

(2) 넓은 형식을 긴 형식으로 변경

  • melt()함수: 넓은 형식(wide format)을 긴 형식(long format)으로 변경
  •  melt(데이터셋, id=”컬럼명”)

 

ex ) 넓은 형식의 데이터를 긴 형식으로 변경

#1 데이터를 긴 형식으로 변경

long <- melt(wide, id = "Customer_ID")
long

 

 

#2 컬럼명 변경

name <- c("Customer_ID", "Date","Buy")
colnames(long) <- name
head(long)
#   Customer_ID Date Buy
# 1           1 day1   3
# 2           2 day1   4
# 3           3 day1   0
# 4           4 day1   0
# 5           5 day1   0
# 6  Sum by day day1   7

 

 

 

 

ex ) smiths 데이터 셋 확인하기

#1  데이터 셋 가져오기

data("smiths")
smiths
# subject time age weight height
# 1 John Smith    1  33     90   1.87
# 2 Mary Smith    1  NA     NA   1.54

 

#2 넓은 형식의 smiths 데이터 셋을 긴 형식으로 변경

long <- melt(id = 1:2, smiths)
long
# subject time variable value
# 1 John Smith    1      age 33.00
# 2 Mary Smith    1      age    NA
# 3 John Smith    1   weight 90.00
# 4 Mary Smith    1   weight    NA
# 5 John Smith    1   height  1.87
# 6 Mary Smith    1   height  1.54

 

 

#3 긴 형식을 넓은 형식으로 변경하기

dcast(long, subject + time ~ ...)
# subject time age weight height
# 1 John Smith    1  33     90   1.87
# 2 Mary Smith    1  NA     NA   1.54

subject와 time컬럼 기준: subject+time ~

 

 

(3) 3차원 배열 형식으로 변경

  • dcast()함수: 데이터프레임 형식으로 구조를 변경
  • acast()함수: 3차원 구조를 갖는 배열형태로 변경

 

ex ) airquality 데이터 셋의 구조 변경

#1 airquality 데이터셋 가져오기

data('airquality')
str(airquality)
# 'data.frame': 153 obs. of  6 variables:
# $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
# $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
# $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
# $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
# $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
# $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...
airquality

 

#2 컬럼제목을 대문자로 일괄 변경

names(airquality) <- toupper(names(airquality))
head(airquality)
# OZONE SOLAR.R WIND TEMP MONTH DAY
# 1    41     190  7.4   67     5   1
# 2    36     118  8.0   72     5   2
# 3    12     149 12.6   74     5   3
# 4    18     313 11.5   62     5   4
# 5    NA      NA 14.3   56     5   5
# 6    28      NA 14.9   66     5   6

 

#3 melt()함수를 이용하여 넓은 형식을 긴 형식으로 변경

air_melt <- melt(airquality, id = c("MONTH", "DAY"), na.rm = TRUE)
head(air_melt)
# MONTH DAY variable value
# 1     5   1    OZONE    41
# 2     5   2    OZONE    36
# 3     5   3    OZONE    12
# 4     5   4    OZONE    18
# 6     5   6    OZONE    28
# 7     5   7    OZONE    23

 

#4 acast()함수를 이용하여 3차원으로 구조 변경

names(air_melt) <- tolower(names(air_melt))
acast <- acast(air_melt, day ~ month ~ variable)
acast
class(acast)
# [1] "array"

 

<집합함수 적용하기>

  • acast(air_melt, month ~ variable, sum, margins = TRUE)
  • acast()함수: month 컬럼을 기준으로 측정변수의 합계 계산
  • margin=TRUE 속성: 각 행과 열의 합계(all) 컬럼 추가
  • 3차 구조인 air_melt데이터셋에 dcast()함수 적용 시 데이터프레임 형태로 구조가 변경

 

반응형

'Programming > R' 카테고리의 다른 글

[ R ]EDA 코딩변경  (0) 2022.11.21
[ R ]EDA 결측치 & 극단치  (0) 2022.11.20
[ R ] dplyr 패키지 활용 #3  (0) 2022.11.19
[ R ] dplyr 패키지 활용 #2  (0) 2022.11.19
[ R ] dplyr 패키지 활용 #1  (0) 2022.11.19
Comments