2024. 10. 6. 01:38ㆍR분석
reshape2
데이터분석을 하게되면 동일한 데이터를 가지고 분석을 하더라도, 목적에 따라 분석기준이 달라지게된다. 이때 데이터의 구조를 데이터를 분석하는 방향성에 맞게 변경해주어야하는데, 이때 사용할수있는 패키지가 바로 reshape2 패키지이다. reshape2패키지는 수집한 데이터의 구조를 분석하기 쉬운형태로 가공할때 사용한다.
reshape2패키지 설치와 데이터 생성
#reshape2 패키지
install.packages('reshape2')
library(reshape2)
#데이터 생성
stu.df <- data.frame(
'name'=c("짱구",'철수','유리'),
'gender'=c('남','남','여'),
'kor'=c(50,100,80),
'math'=c(70,90,100),
'eng'=c(65,85,70)
)
stu.df
다른 패키지들과 마찬가지로 일단 패키지를 설치한후 라이브러리에 로드한다.
그후 reshape2패키지에서 사용할 데이터 프레임을 생성해준다.
melt()
#melt(데이터, id.vars=기준이되는 열, measure.vars=반환열)
melt_test <- melt(stu.df,id.vars='name',measure.vars=c('kor','math'))
melt_test
#name열을 기준으로 국어, 수학점수가 새로로 재배치
melt(stu.df,id.vars=c('kor','math'),measure.vars='name')
#id,vars를 설정하지 않으면 데이터의 첫번째 열이 자동적으로 기준이됨
melt_test1 <- melt(stu.df,measure.vars=c('kor','math'))
melt_test1
#id.vars를 적지않아도 name기준이 되었으며, 모든 열이 반환
#name 열 기준으로 국어와 수학점수가 세로로 재배치
melt_test <- melt(stu.df)
#Using name, gender as id variables : 성별이나 이름과같은 고유값을
#식별변수로 사용하겠다는 뜻
melt_test
melt()함수는 데이터를 행이 긴 형태로 바꾸는 함수이다. melt(데이터, id.vars=기준열, measure.vars=반환열)의 형태로 사용하며, id.vars에 입력된 열을 기준으로 measure.vars의 열들이 나열되는 형식이다. 기준열에 name을 넣어 이름을 기준으로 반환열인 국어점수와 수학점수가 나열되게 한 쿼리문의 결과이다. 원래는 열이름이었던 kor와 math가 새로운 variable이라는 열안에 값으로 들어가면서 데이터가 나열된것을 확인할 수 있다. 이때문에 기준열이 되는 name에는 중복으로 값이 들어가게된다.
위 쿼리문은 기준열에 국어,수학점수를 적고 이름값으로 반환을 받겠다는 쿼리문인데 이처럼 기준열에 어떤것을 적는지에 따라 값이 달라진다.
만약 기준열을 적지않고 반환열만 적었다면 자동으로 melt함수에 기입된 데이터 프레임중에서 가장 첫번째로 존재하는 열이 기준이 되며, 반환값에 따로 값을 적었더라도 전체가 반환된다.
기준열도 적지 않고 반환열도 적지않은 상태에서 그냥 데이터를 melt함수에 대입만 하게되면 성별이나 이름같은 고유값을 식별변수로 사용하겠다는 문장과 함께 name과 gender가 기준이 되어 값이 출력된다.
cast()
cast에는 dcast와 acast가 존재한다.
dcast
#cast()
#dcast(데이터, 기준열~변환)
#dcast비교를 위해 melt함수로 데이터 구조 변경 후 사용
melt_test <- melt(stu.df, id.vars='name',measure.vars=c('kor','math'))
melt_test
dc_test <- dcast(melt_test,name~variable)
dc_test
#variable(과목이름) 범주형 데이터가 열이름으로 변환
#기준열이 여러개일때(+사용)
melt_test <- melt(stu.df)
melt_test #이름과 성별기준으로 나열
dc_test <- dcast(melt_test,name+gender~variable)
#기준열이 여러개일때 +를 사용하여 나열해줌
dc_test #이름이랑 성별 기준으로 재배치
dc_test1 <- dcast(melt_test,gender+variable+value~name)
dc_test1 #기준열이 성별, 과목, 점수가 되었으므로 이름이 나열됨
#이름은 해당값이 없는 경우 na로 처리
dcast는 데이터를 변형하여 데이터프레임형태로 반환해주는 함수로 dcast(데이터, 기준열~반환열)의 형태로 사용한다. 기존 melt()함수로 인해 데이터가 늘어져있는 상태에서 다시 기준열을 name으로 두고, 반환열에 국어,수학점수를 기입하여 기존의 데이터프레임으로 다시 반환한 쿼리문의 결과이다.
만약 dcast를 사용할때 기준열이 여러개라면 +를 사용하여 연산처럼 묶어주어 사용하면 된다. 위의 melt된 데이터에서 dcast로 변형시킬때 기준에 name+gender를 적용하여 기준을 2개로 설정한 결과이다.
melt와 마찬가지로 기준열에 어떤 값을 적느냐에따라 값이 달라지게 되는데, 이 경우는 melt데이터에서 과목점수가 들어가있는 국어,수학과 성별,점수를 한번에 기준으로 정하고 이름을 반환받는 형식이다. 이름이 반환값이다보니, 특정 값에 해당되지 않아, 비어있는 값들이 생성되는데, 이때는 결측치인 NA로 처리된다.
acast
#acast(데이터, 기준열~반환열~분리기준열)
melt_test
#학생들의 이름을 기준으로 과목점수마다 성별 확인
ac_test <- acast(melt_test,name~gender~variable)
ac_test
class(ac_test) #array
#학생들의 이름을 기준으로 성별마다 과목점수 확인
ac_test1 <- acast(melt_test,name~variable~gender)
ac_test1
class(ac_test) #array
#이름을 기준으로 name열을 반환한 데이터에는
#variable(과목)별로 데이터가 분리된다
acast는 dcast와 사용법이 거의 비슷한데, dcast가 데이터프레임으로 데이터를 반환해준다면 acast는 행렬, 백터 등으로 데이터를 반환해주는 함수이다. acast(데이터, 기준열~반환열~분리기준열)의 형태로 작성한다. 첫번째 쿼리문의 경우, 이름을 기준으로 두고 성별을 반환하는데 분리기준으로 과목이름이 들어가있는 variable을 설정한 결과이다.
두번째는 학생들의 이름을 기준으로 성별마다 과목점수를 확인한 쿼리이다. 성별마다 과목점수를 확인하는 것이기때문에 acast(name~variable~gender)로 작성해야한다.
cast함수 사용하여 데이터 요약하기
#cast함수로 데이터를 사용하면 요약면 사용가능
#성별을 기준으로 과목당 합계(dcast)
dcast(melt_test,gender~variable)
#cast에서 함수사용하기
dcast(melt_test,gender~variable,sum)
#성별별로 과목당 합계반환
#성별을 기준으로 과목당 평균점수 확인(acast)
acast(melt_test,gender~variable,mean)
cast함수를 이용할때 기준열에 어떤 값을 넣느냐에 따라 데이터의 집계요약된 값을 확인할 수 있다. 위의 쿼리에서는 기준으로 이름을 설정하게 되면 이름별로 가지고 있는 과목점수가 있기때문에 과목점수가 나오지만, 성별을 기준으로할때는 과목점수가 아니라 과목에 해당하는 값이 몇개인지 합계를 반환하여 보여준다. 이처럼 cast함수의 기준에 따라서 cast함수는 데이터가 원래 가지고있는 값을 보여줄 수도 있으며, 요약된 값을 보여줄 수 도 있는데, 내가 직접 원하는 값을 보고싶다면 직접 집계함수를 함께 옵션으로 주면 된다.
이처럼 cast에서 함수를 사용하려면 dcast(데이터,기준열~반환열,함수)의 형태로 적어 사용한다. 위의 쿼리에서는 성별을 기준으로 과목점수를 반환받을 건데 sum함수를 함께 적어, 성별에 따른 과목점수의 합산을 결과로 반환받은 것이다.
acast를 사용할때도 마찬가지로 acast(기준열,반환열~분리기준열(사용시),함수)의 형태로 적으며, 이때 반환되는 결과는 acast를 사용했기때문에 array로 반환된다.
melt,cast활용 실습
#=======실습=======#
#직원정보 데이터프레임 생성
emp.info <- data.frame(
'name'=c('한유진','한유민','김해진','박동해'),
'age'=c(25,27,25,20),
'dept'=c('개발','개발','영업','생산'),
'sal'=c(200,300,400,200)
)
emp.info
#1)직원 이름을 기준으로 부서와 나이 반환받기
emp_melt<- melt(emp.info,id.vars='name',measure.vars=c('dept','age'))
emp_melt
#2)melt된 emp_melt를 name을 기준으로 부서반환받기
dcast(emp_melt,name~variable)
학습일기
오늘은 데이터의 구조를 변경시킬 수 있는 reshape2패키지의 melt함수와 cast함수에 대해서 학습했다. 데이터의 구조를 변경시킨다는 개념은 어렵지않았는데, acst에서 일반 기준열과 분리기준열의 차이점을 이해하는게 조금 어려워서 계속 만들어보고 지우고 만들어보고 지우고를 반복했던것 같다. 실무에서같은 데이터라도 데이터의 분석방법에따라 데이터의 구조가 달라져야한다는것도 신기했고, 그만큼 reshape2패키지도 굉장히 실무에서 많이 사용되는 함수라는 생각이 들었다. r로 데이터분석 연습을 할때 먼저 분석 로직을 구성함과 동시에 현재 내가 가지고있는 데이터구조가 분석에 올바른 구조인지 먼저 파악해야하는 습관을 길러야겠다..!
'R분석' 카테고리의 다른 글
R복습_데이터 시각화2_ (그래프에 회귀선그리기(단순회귀분석), 그래프 객체 추가,도형 및 화살표 추가) (0) | 2024.10.07 |
---|---|
R복습_데이터 시각화1_ ggplot2(산점도, 꺾은선, 막대, 누적,박스,히스토그램, 선버스트,gridExtra 등) (1) | 2024.10.07 |
R복습_stringr패키지와 함수(문자열 가공) (0) | 2024.10.05 |
R복습_dplyr패키지(추출및 정렬함수,통계요약함수,샘플데이터추출함수) (0) | 2024.10.04 |
R복습_파일입출력(text,csv,excel,절대경로와 상대경로) (2) | 2024.10.01 |