59doit
[ R ]reshape2 패키지 활용 본문
반응형
reshape2
- reshape패키지의 기본 골격만을 대상으로 개발된 패키지
- melt()함수와 dcast/acast()함수를 적용하여 집단변수를 통해서 데이터의구조를 유연하게 변경해주는 기능을 제공
(1) 긴 형식을 넓은 형식으로 변경
- dcast()함수: 긴 형식(Long format)의 데이터를 넓은 형식(Wide format)으로 변경
ex ) reshape2 패키지 설치와 데이터 가져오기
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 ) 파일 저장 및 읽기
- 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