본 강의는 R과 Rstudio 의 설치과정은 생략한다. 혹시 설치를 하지 못하였다면 http://www.r-project.org/ 와 http://www.rstudio.com/ 를 참조하여 설치하길 바란다. R에 대한 전반적인 도움말은 help.start() 명령어를 활용하면 되고 함수 별 도움말을 보려면 help(which) 와 같이 실행하면 된다.
R의 이용능력을 대략적으로 다음과 같이 분류할 수 있다.
본 강의에서는 기본적인 데이터 정리를 R에서 수행하는 것을 첫번째 목표로 할 것이며 Table 1 를 간단히 작성하는 법, 기본적인 그림 그리는 방법을 추가적으로 학습할 것이다.
R 의 기본 연산 단위는 벡터이며 x=c(1,2,3)
이라고 쓰면 1,2,3 으로 이루어진 길이 3인 벡터를 x
에 저장하는 것이다. 기타 연산은 직접 실습으로 알아보자.
x=c(1,2,3,4,5,6) ## vector of variable
y=c(7,8,9,10,11,12)
x+y
## [1] 8 10 12 14 16 18
x*y
## [1] 7 16 27 40 55 72
sqrt(x)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490
sum(x)
## [1] 21
sum(x>=4) ## No sum, number
## [1] 3
diff(x)
## [1] 1 1 1 1 1
mean(x)
## [1] 3.5
sd(x)
## [1] 1.870829
max(x)
## [1] 6
max(x,y)
## [1] 12
length(x)
## [1] 6
x[2]
## [1] 2
x[-2]
## [1] 1 3 4 5 6
x[1:3]
## [1] 1 2 3
x[c(1,3,4,5,6)]
## [1] 1 3 4 5 6
x[c(1,2,3)]
## [1] 1 2 3
이번에는 벡터를 생성하는 다양한 방법들을 예시를 통해 배워보도록 한다.
## Sequence
v1=seq(-5,5,by=.2); v1
## [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
## [16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8
## [31] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8
## [46] 4.0 4.2 4.4 4.6 4.8 5.0
## Repeat
v2=rep(1,3); v2
## [1] 1 1 1
v3=rep(c(1,2,3),2); v3 ## Repeat for vector
## [1] 1 2 3 1 2 3
v4=rep(c(1,2,3),each = 2); v4 ## Repeat for vector : each
## [1] 1 1 2 2 3 3
마찬가지로 예시를 통해 배워보자.
## for loop
for (i in 1:3){
print(i)
}
## [1] 1
## [1] 2
## [1] 3
i=0
for (j in c(1,2,4,5,6)){
i=i+j
}
i
## [1] 18
## if
x=5
if (x >=3 ){
x=x+3
}
x
## [1] 8
x=5
if (x >=10){
print("High")
} else if (x >=5){
print("Medium")
} else {
print("Low")
} ## if, else if 주의: 반드시 } 와 같은 줄에 위치하도록.
## [1] "Medium"
## ifelse
x=5
y=ifelse(x==5,"OK","Suck") ## ifelse(조건,참일때,거짓일때)
y
## [1] "OK"
##함수 만들기 기초수준에서는 함수를 만들어 쓸일이 거의 없을 것이다. 그러나 평균, 분산 등을 구할 때 결측치가 있으면 R은 NA
를 출력하는 문제점이 있어 이를 해결하기 위해서라도 기본적인 함수 만드는 법은 알고 있는 것이 좋다. 예제를 통해 살펴보자.
x=c(1:10,12,13,NA,NA,15,17) ## 결측치가 포함되어 있다면..
mean(x)
## [1] NA
mean0=function(x){
mean(x,na.rm=T)
} ## x에 대한 함수이며 mean함수에 na.rm 옵션을 TRUE로 해두었다. default는 F
mean0=function(x){mean(x,na.rm=T)} ## 한줄에 쓸 수도 있다.
mean0(x)
## [1] 8
하나 이상의 변수를 포함한 함수도 다음과 같이 만들 수 있다.
twomean=function(x1,x2){
a=(x1+x2)/2
a
}
twomean(4,6)
## [1] 5
R은 벡터 기반의 연산을 지원하므로 이를 이용하면 여러가지 계산을 간단히 할 수 있다. 예제로 살펴보자.
mat=matrix(1:20,nrow=4,byrow=T) ## 4행 5열, byrow=T : 행부터 채운다.
mat
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
## [3,] 11 12 13 14 15
## [4,] 16 17 18 19 20
apply(mat,1,mean) ## 1: 행- 행별로 평균
## [1] 3 8 13 18
apply(mat,2,mean) ## 2: 열- 열별로 평균
## [1] 8.5 9.5 10.5 11.5 12.5
sapply(1:nrow(mat),function(x){mean(mat[x,])})
## [1] 3 8 13 18
sapply(1:ncol(mat),function(x){mean(mat[,x])})
## [1] 8.5 9.5 10.5 11.5 12.5
lapply(1:nrow(mat),function(x){mean(mat[x,])}) ## Return list type
## [[1]]
## [1] 3
##
## [[2]]
## [1] 8
##
## [[3]]
## [1] 13
##
## [[4]]
## [1] 18
unlist(lapply(1:nrow(mat),function(x){mean(mat[x,])})) ## Same to sapply
## [1] 3 8 13 18
한편 for
문의 과도한 사용은 분석의 속도를 저하시키는 가장 큰 요인 중 하나인데 간단한 예를 통해 문제점을 살펴보자.
## for 문을 이용한 합구하는 함수 만들기
sum_f=function(x){
out=0
for (i in 1:x){
out=out+i
}
return(out)
}
system.time(sum_f(10^6)) ## system.time - 시간 잰다.
## user system elapsed
## 0.042 0.000 0.043
system.time(sum(as.numeric(1:10^6))) ## 내장 sum 함수- 더할 것이 많으면 as.numeric을 넣어줘야 한다.
## user system elapsed
## 0 0 0
따라서 for문을 최대한 덜 쓰고 벡터연산을 활용하는 것이 실행시간을 줄이는 핵심이며, Apply 문의 적극적인 사용으로 이를 해결할 수 있다. 더 나아가서 멀티코어를 활요한 병렬처리 명령어를 이용함으로서 더욱 시간을 줄일 수 있는데 1초동안 가만히 있는 Sys.sleep(1)
함수를 가지고 예를 들어보겠다. 단, 병렬처리는 가급적 Mac/Linux
환경에서 수행하는 것을 추천하는데 mclapply
라는 함수로 그냥 sapply
, lapply
쓰듯이 똑같이 쓸 수 있는 장점이 있다. Window 환경에서는 이보다는 복잡한 과정을 거쳐야 한다.
for (i in 1:8){Sys.sleep(1)}
system.time(for (i in 1:8){Sys.sleep(1)}) ## 걸리는 시간 : 8초 정도
## user system elapsed
## 0.004 0.000 8.012
system.time(sapply(1:8,function(x){Sys.sleep(1)})) ## 약간 덜?
## user system elapsed
## 0.003 0.000 8.011
library(parallel) ## for 병렬 처리
mclapply(1:8,function(x){Sys.sleep(1)}) ## Only for MAc/Linux : Not for window - 코어 하나만 이용한다.
## [[1]]
## NULL
##
## [[2]]
## NULL
##
## [[3]]
## NULL
##
## [[4]]
## NULL
##
## [[5]]
## NULL
##
## [[6]]
## NULL
##
## [[7]]
## NULL
##
## [[8]]
## NULL
## For windows
num_cores <- detectCores() ## Number of Cores
cl <- makeCluster(num_cores) ## Cluster 만들기
parSapply(cl,1:8,function(x){Sys.sleep(1)})
## [[1]]
## NULL
##
## [[2]]
## NULL
##
## [[3]]
## NULL
##
## [[4]]
## NULL
##
## [[5]]
## NULL
##
## [[6]]
## NULL
##
## [[7]]
## NULL
##
## [[8]]
## NULL
system.time(parSapply(cl,1:8,function(x){Sys.sleep(1)})) ## 1초
## user system elapsed
## 0.004 0.000 1.005
#clusterEvalQ(cl, {library(survival)}) ## parSapply 안의 함수안에 특정 패키지의 명령어가 있다면 그 패키지 미리 지정.
#clusterExport(cl,c("run_feature","event_time")) ## 자체 만든 함수나 객체를 쓴다면 미리 지정
stopCluster(cl) ## 종료
이제부터는 실제 데이터를 읽어서 그 데이터를 매니징 하는 방법을 배워보도록 하겠다.
데이터를 불러오기 전에 미리 디렉토리를 지정하면 그 다음부터는 편하게 읽고 쓸 수 있다.
getwd() ## 현재 디렉토리
## [1] "/home/jinseob2kim/Dropbox/Hompage/jinseob2kim.github.io"
setwd("/home/jinseob2kim/Dropbox/consult/practice") ## 디렉토리 설정
getwd()
## [1] "/home/jinseob2kim/Dropbox/consult/practice"
여기서 주의해야 할 점은 폴더간의 구분을 / 로 해야 한다는 점이다. R 은 유닉스 기반의 언어이기 때문이다. 이제 실습 데이터를 읽어보도록 하자. 가급적이면 데이터포맷은 csv
로 통일하는 것을 추천한다. 콤마로 분리된 가장 간단 한 형태의 파일로서 용량도 작고 어떤 소프트웨어에서도 읽을 수 있다는 장점이 있다. 물론 R에서 SPSS, SAS, Excel파일을 읽을 수도 있지만 본 실습에서는 생략하도록 하겠다.
setwd("/home/jinseob2kim/Dropbox/consult/practice")
a=read.csv("i_all.csv") ## 첫번째 행은 변수명으로 자동 인식
a=read.table("i_all.csv", sep=",", header=T) ## 구분자와 첫번째 행 인식여부를 직접
head(a) ## 처음 6행 보기
## PERSON_ID EXMD_BZ_YYYY YKIHO_GUBUN_CD E_HGHT E_HGHT_PCT E_HGHT_JDG E_WGHT
## 1 10934240 2014 33 106.3 2 2 19.1
## 2 11209245 2014 37 107.9 9 1 17.5
## 3 11222323 2014 20 113.5 47 1 20.1
## 4 11536379 2014 30 117.0 67 1 20.2
## 5 11822836 2014 34 111.0 19 1 17.9
## 6 12020725 2014 30 105.9 3 2 18.2
## E_WGHT_PCT E_WGHT_JDG E_BMI E_BMI_PCT E_BMI_JDG E_VIS_Q_JDG E_AUD_Q_JDG
## 1 23 1 16.9 74 1 2 1
## 2 12 1 15.0 34 1 1 1
## 3 50 1 15.6 51 1 1 1
## 4 39 1 14.8 22 1 1 1
## 5 9 1 14.5 15 1 1 1
## 6 21 1 16.2 66 1 1 1
## E_DVAS_MTHD E_DVAS_JDG Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## 1 NA 1 2 3.3 1 1
## 2 NA 1 2 3.1 1 1
## 3 NA 1 2 3.2 1 1
## 4 NA 1 2 2.9 1 1
## 5 NA 1 2 2.7 1 1
## 6 NA 1 1 1.8 1 1
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ
## 1 3 1 5 1 4
## 2 3 1 4 1 3
## 3 3 1 4 1 3
## 4 3 1 5 1 4
## 5 3 1 5 1 4
## 6 3 1 5 1 4
## Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## 1 1 2 1 1 1
## 2 1 1 1 1 1
## 3 1 2 1 1 1
## 4 1 2 1 1 1
## 5 1 2 1 1 1
## 6 1 2 1 1 1
## Q_VCC_JENC_FRQ Q_PSMK_Q1 Q_PSMK_Q2 Q_PSMK_Q3 Q_PSMK_Q4 number Q_NTR_Q2_1
## 1 3 1 2 1 NA 7 NA
## 2 3 1 2 2 1 7 NA
## 3 3 2 2 1 1 7 NA
## 4 3 2 2 2 2 7 NA
## 5 3 2 2 1 1 7 NA
## 6 3 2 2 1 1 7 NA
## Q_NTR_Q2_2 Q_NTR_Q2_3 Q_NTR_Q2_4 Q_NTR_Q2_5
## 1 NA NA NA NA
## 2 NA NA NA NA
## 3 NA NA NA NA
## 4 NA NA NA NA
## 5 NA NA NA NA
## 6 NA NA NA NA
저장도 csv
로 하는 것을 추천하며 실습도 이것만 하겠다.
write.csv(a,"i_all_write.csv")
write.csv(a,"i_all_write.csv",quote=F,row.names=F) ## 문자형변수의 ''빼기, 행번호 삭제
이제부터는 본격적으로 읽은 데이터를 살펴보도록 하겠다. 실습데이터는 2008-2014년의 영유아 건강검진 자료이며 자세 한 설명은 다른 문서를 참조하길 바란다.
head(a) ## 처음 6행
## PERSON_ID EXMD_BZ_YYYY YKIHO_GUBUN_CD E_HGHT E_HGHT_PCT E_HGHT_JDG E_WGHT
## 1 10934240 2014 33 106.3 2 2 19.1
## 2 11209245 2014 37 107.9 9 1 17.5
## 3 11222323 2014 20 113.5 47 1 20.1
## 4 11536379 2014 30 117.0 67 1 20.2
## 5 11822836 2014 34 111.0 19 1 17.9
## 6 12020725 2014 30 105.9 3 2 18.2
## E_WGHT_PCT E_WGHT_JDG E_BMI E_BMI_PCT E_BMI_JDG E_VIS_Q_JDG E_AUD_Q_JDG
## 1 23 1 16.9 74 1 2 1
## 2 12 1 15.0 34 1 1 1
## 3 50 1 15.6 51 1 1 1
## 4 39 1 14.8 22 1 1 1
## 5 9 1 14.5 15 1 1 1
## 6 21 1 16.2 66 1 1 1
## E_DVAS_MTHD E_DVAS_JDG Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## 1 NA 1 2 3.3 1 1
## 2 NA 1 2 3.1 1 1
## 3 NA 1 2 3.2 1 1
## 4 NA 1 2 2.9 1 1
## 5 NA 1 2 2.7 1 1
## 6 NA 1 1 1.8 1 1
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ
## 1 3 1 5 1 4
## 2 3 1 4 1 3
## 3 3 1 4 1 3
## 4 3 1 5 1 4
## 5 3 1 5 1 4
## 6 3 1 5 1 4
## Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## 1 1 2 1 1 1
## 2 1 1 1 1 1
## 3 1 2 1 1 1
## 4 1 2 1 1 1
## 5 1 2 1 1 1
## 6 1 2 1 1 1
## Q_VCC_JENC_FRQ Q_PSMK_Q1 Q_PSMK_Q2 Q_PSMK_Q3 Q_PSMK_Q4 number Q_NTR_Q2_1
## 1 3 1 2 1 NA 7 NA
## 2 3 1 2 2 1 7 NA
## 3 3 2 2 1 1 7 NA
## 4 3 2 2 2 2 7 NA
## 5 3 2 2 1 1 7 NA
## 6 3 2 2 1 1 7 NA
## Q_NTR_Q2_2 Q_NTR_Q2_3 Q_NTR_Q2_4 Q_NTR_Q2_5
## 1 NA NA NA NA
## 2 NA NA NA NA
## 3 NA NA NA NA
## 4 NA NA NA NA
## 5 NA NA NA NA
## 6 NA NA NA NA
R은 결측치를 NA
로 표시한다.
tail(a) ## 마지막 6행
## PERSON_ID EXMD_BZ_YYYY YKIHO_GUBUN_CD E_HGHT E_HGHT_PCT E_HGHT_JDG E_WGHT
## 45532 67072117 2008 33 63.6 37 1 6.2
## 45533 67102166 2008 31 62.0 17 1 6.5
## 45534 67555298 2008 31 75.4 99 1 8.1
## 45535 68245952 2008 35 67.5 76 1 8.0
## 45536 68377071 2008 31 65.8 70 1 7.3
## 45537 68484655 2008 33 64.5 32 1 6.7
## E_WGHT_PCT E_WGHT_JDG E_BMI E_BMI_PCT E_BMI_JDG E_VIS_Q_JDG E_AUD_Q_JDG
## 45532 12 1 NA NA NA 1 1
## 45533 22 1 NA NA NA 1 1
## 45534 88 1 NA NA NA 1 2
## 45535 70 1 NA NA NA 1 1
## 45536 59 1 NA NA NA 1 1
## 45537 15 1 NA NA NA 1 1
## E_DVAS_MTHD E_DVAS_JDG Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## 45532 NA NA NA NA NA NA
## 45533 NA NA NA NA NA NA
## 45534 NA NA NA NA NA NA
## 45535 NA NA NA NA NA NA
## 45536 NA NA NA NA NA NA
## 45537 NA NA NA NA NA NA
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ
## 45532 NA NA NA NA NA
## 45533 NA NA NA NA NA
## 45534 NA NA NA NA NA
## 45535 NA NA NA NA NA
## 45536 NA NA NA NA NA
## 45537 NA NA NA NA NA
## Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## 45532 NA NA NA NA NA
## 45533 NA NA NA NA NA
## 45534 NA NA NA NA NA
## 45535 NA NA NA NA NA
## 45536 NA NA NA NA NA
## 45537 NA NA NA NA NA
## Q_VCC_JENC_FRQ Q_PSMK_Q1 Q_PSMK_Q2 Q_PSMK_Q3 Q_PSMK_Q4 number Q_NTR_Q2_1
## 45532 NA NA NA NA NA 1 NA
## 45533 NA NA NA NA NA 1 NA
## 45534 NA NA NA NA NA 1 NA
## 45535 NA NA NA NA NA 1 NA
## 45536 NA NA NA NA NA 1 NA
## 45537 NA NA NA NA NA 1 NA
## Q_NTR_Q2_2 Q_NTR_Q2_3 Q_NTR_Q2_4 Q_NTR_Q2_5
## 45532 NA NA NA NA
## 45533 NA NA NA NA
## 45534 NA NA NA NA
## 45535 NA NA NA NA
## 45536 NA NA NA NA
## 45537 NA NA NA NA
names(a) ## 변수명
## [1] "PERSON_ID" "EXMD_BZ_YYYY" "YKIHO_GUBUN_CD" "E_HGHT"
## [5] "E_HGHT_PCT" "E_HGHT_JDG" "E_WGHT" "E_WGHT_PCT"
## [9] "E_WGHT_JDG" "E_BMI" "E_BMI_PCT" "E_BMI_JDG"
## [13] "E_VIS_Q_JDG" "E_AUD_Q_JDG" "E_DVAS_MTHD" "E_DVAS_JDG"
## [17] "Q_PREM" "Q_BTH_WGHT" "Q_VCC_BCG_YN" "Q_VCC_HBV_YN"
## [21] "Q_VCC_HBV_FRQ" "Q_VCC_DPT_YN" "Q_VCC_DPT_FRQ" "Q_VCC_POLIO_YN"
## [25] "Q_VCC_POLIO_FRQ" "Q_VCC_MMR_YN" "Q_VCC_MMR_FRQ" "Q_VCC_CPOX_YN"
## [29] "Q_VCC_CPOX_FRQ" "Q_VCC_JENC_YN" "Q_VCC_JENC_FRQ" "Q_PSMK_Q1"
## [33] "Q_PSMK_Q2" "Q_PSMK_Q3" "Q_PSMK_Q4" "number"
## [37] "Q_NTR_Q2_1" "Q_NTR_Q2_2" "Q_NTR_Q2_3" "Q_NTR_Q2_4"
## [41] "Q_NTR_Q2_5"
a$E_BMI[1:10] ## BMI변수의 처음 10개 행만..
## [1] 16.9 15.0 15.6 14.8 14.5 16.2 14.5 15.2 17.4 21.0
dim(a) ## 행갯수, 열갯수
## [1] 45537 41
nrow(a) ## 행
## [1] 45537
ncol(a) ## 열
## [1] 41
class(a) ## 클라스. 일단 data.frame이라는 정도만 알고 넘어가자.
## [1] "data.frame"
str(a) ## 데이터 구조 살펴보기
## 'data.frame': 45537 obs. of 41 variables:
## $ PERSON_ID : int 10934240 11209245 11222323 11536379 11822836 12020725 12199586 12266756 12641133 12690137 ...
## $ EXMD_BZ_YYYY : int 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
## $ YKIHO_GUBUN_CD : int 33 37 20 30 34 30 30 35 34 32 ...
## $ E_HGHT : num 106 108 114 117 111 ...
## $ E_HGHT_PCT : int 2 9 47 67 19 3 17 32 38 92 ...
## $ E_HGHT_JDG : int 2 1 1 1 1 2 1 1 1 1 ...
## $ E_WGHT : num 19.1 17.5 20.1 20.2 17.9 18.2 17.7 19 22 30.4 ...
## $ E_WGHT_PCT : int 23 12 50 39 9 21 7 33 74 99 ...
## $ E_WGHT_JDG : int 1 1 1 1 1 1 1 1 1 2 ...
## $ E_BMI : num 16.9 15 15.6 14.8 14.5 16.2 14.5 15.2 17.4 21 ...
## $ E_BMI_PCT : int 74 34 51 22 15 66 15 40 85 99 ...
## $ E_BMI_JDG : int 1 1 1 1 1 1 1 1 1 2 ...
## $ E_VIS_Q_JDG : int 2 1 1 1 1 1 1 1 1 1 ...
## $ E_AUD_Q_JDG : int 1 1 1 1 1 1 1 1 1 1 ...
## $ E_DVAS_MTHD : int NA NA NA NA NA NA NA NA NA NA ...
## $ E_DVAS_JDG : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_PREM : int 2 2 2 2 2 1 2 2 2 2 ...
## $ Q_BTH_WGHT : num 3.3 3.1 3.2 2.9 2.7 1.8 3.1 3.5 2.9 3.8 ...
## $ Q_VCC_BCG_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_HBV_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_HBV_FRQ : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Q_VCC_DPT_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_DPT_FRQ : int 5 4 4 5 5 5 4 5 5 4 ...
## $ Q_VCC_POLIO_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_POLIO_FRQ: int 4 3 3 4 4 4 3 4 4 3 ...
## $ Q_VCC_MMR_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_MMR_FRQ : int 2 1 2 2 2 2 1 2 2 1 ...
## $ Q_VCC_CPOX_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_CPOX_FRQ : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_JENC_YN : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Q_VCC_JENC_FRQ : int 3 3 3 3 3 3 2 3 3 3 ...
## $ Q_PSMK_Q1 : int 1 1 2 2 2 2 1 2 1 2 ...
## $ Q_PSMK_Q2 : int 2 2 2 2 2 2 1 2 1 2 ...
## $ Q_PSMK_Q3 : int 1 2 1 2 1 1 2 1 2 1 ...
## $ Q_PSMK_Q4 : int NA 1 1 2 1 1 1 1 1 1 ...
## $ number : int 7 7 7 7 7 7 7 7 7 7 ...
## $ Q_NTR_Q2_1 : int NA NA NA NA NA NA NA NA NA NA ...
## $ Q_NTR_Q2_2 : int NA NA NA NA NA NA NA NA NA NA ...
## $ Q_NTR_Q2_3 : int NA NA NA NA NA NA NA NA NA NA ...
## $ Q_NTR_Q2_4 : int NA NA NA NA NA NA NA NA NA NA ...
## $ Q_NTR_Q2_5 : int NA NA NA NA NA NA NA NA NA NA ...
summary(a) ## 대략적인 요약.
## PERSON_ID EXMD_BZ_YYYY YKIHO_GUBUN_CD E_HGHT
## Min. :10005819 Min. :2008 Min. :10.00 Min. : 9.30
## 1st Qu.:35800784 1st Qu.:2009 1st Qu.:30.00 1st Qu.: 73.50
## Median :57100463 Median :2011 Median :32.00 Median : 91.30
## Mean :56411261 Mean :2011 Mean :30.57 Mean : 89.72
## 3rd Qu.:77709454 3rd Qu.:2012 3rd Qu.:34.00 3rd Qu.:103.80
## Max. :99997712 Max. :2014 Max. :92.00 Max. :174.00
## NA's :12
## E_HGHT_PCT E_HGHT_JDG E_WGHT E_WGHT_PCT
## Min. : 1.00 Min. :1.000 Min. : 1.10 Min. : 1.00
## 1st Qu.:29.00 1st Qu.:1.000 1st Qu.: 9.50 1st Qu.:30.00
## Median :52.00 Median :1.000 Median :13.20 Median :55.00
## Mean :51.39 Mean :1.029 Mean :13.69 Mean :53.71
## 3rd Qu.:74.00 3rd Qu.:1.000 3rd Qu.:17.00 3rd Qu.:78.00
## Max. :99.00 Max. :2.000 Max. :75.80 Max. :99.00
## NA's :2 NA's :16 NA's :5
## E_WGHT_JDG E_BMI E_BMI_PCT E_BMI_JDG
## Min. :1.000 Min. : 5.80 Min. : 1.00 Min. :1.000
## 1st Qu.:1.000 1st Qu.:15.00 1st Qu.:32.00 1st Qu.:1.000
## Median :1.000 Median :15.90 Median :57.00 Median :1.000
## Mean :1.045 Mean :16.06 Mean :54.71 Mean :1.063
## 3rd Qu.:1.000 3rd Qu.:16.80 3rd Qu.:79.00 3rd Qu.:1.000
## Max. :2.000 Max. :55.80 Max. :99.00 Max. :2.000
## NA's :19 NA's :28157 NA's :28164 NA's :28159
## E_VIS_Q_JDG E_AUD_Q_JDG E_DVAS_MTHD E_DVAS_JDG
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
## Median :1.000 Median :1.000 Median :1.000 Median :1.000
## Mean :1.017 Mean :1.016 Mean :1.003 Mean :1.039
## 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.000
## Max. :2.000 Max. :2.000 Max. :2.000 Max. :4.000
## NA's :8 NA's :20 NA's :15256 NA's :9803
## Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## Min. :1.000 Min. :0.000 Min. :1.000 Min. :1.000
## 1st Qu.:2.000 1st Qu.:3.000 1st Qu.:1.000 1st Qu.:1.000
## Median :2.000 Median :3.200 Median :1.000 Median :1.000
## Mean :1.971 Mean :3.193 Mean :1.002 Mean :1.001
## 3rd Qu.:2.000 3rd Qu.:3.500 3rd Qu.:1.000 3rd Qu.:1.000
## Max. :2.000 Max. :9.900 Max. :2.000 Max. :2.000
## NA's :10617 NA's :10112 NA's :10129 NA's :10081
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN
## Min. :0.000 Min. :1.000 Min. :0.00 Min. :1.000
## 1st Qu.:3.000 1st Qu.:1.000 1st Qu.:3.00 1st Qu.:1.000
## Median :3.000 Median :1.000 Median :4.00 Median :1.000
## Mean :2.701 Mean :1.001 Mean :3.57 Mean :1.002
## 3rd Qu.:3.000 3rd Qu.:1.000 3rd Qu.:4.00 3rd Qu.:1.000
## Max. :7.000 Max. :2.000 Max. :9.00 Max. :2.000
## NA's :10213 NA's :10081 NA's :10210 NA's :10463
## Q_VCC_POLIO_FRQ Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN
## Min. :0.000 Min. :1.000 Min. :0.000 Min. :1.00
## 1st Qu.:3.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.00
## Median :3.000 Median :1.000 Median :1.000 Median :1.00
## Mean :2.907 Mean :1.004 Mean :1.189 Mean :1.01
## 3rd Qu.:3.000 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.00
## Max. :6.000 Max. :2.000 Max. :5.000 Max. :2.00
## NA's :10624 NA's :16827 NA's :17045 NA's :16832
## Q_VCC_CPOX_FRQ Q_VCC_JENC_YN Q_VCC_JENC_FRQ Q_PSMK_Q1
## Min. :0.00 Min. :1.000 Min. :0.000 Min. :1.00
## 1st Qu.:1.00 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:1.00
## Median :1.00 Median :1.000 Median :3.000 Median :2.00
## Mean :0.98 Mean :1.012 Mean :2.331 Mean :1.54
## 3rd Qu.:1.00 3rd Qu.:1.000 3rd Qu.:3.000 3rd Qu.:2.00
## Max. :5.00 Max. :2.000 Max. :7.000 Max. :2.00
## NA's :17144 NA's :16843 NA's :17124 NA's :40038
## Q_PSMK_Q2 Q_PSMK_Q3 Q_PSMK_Q4 number
## Min. :1.00 Min. :1.00 Min. :1.00 Min. :1.000
## 1st Qu.:2.00 1st Qu.:1.00 1st Qu.:1.00 1st Qu.:2.000
## Median :2.00 Median :1.00 Median :1.00 Median :4.000
## Mean :1.87 Mean :1.22 Mean :1.09 Mean :3.707
## 3rd Qu.:2.00 3rd Qu.:1.00 3rd Qu.:1.00 3rd Qu.:5.000
## Max. :2.00 Max. :2.00 Max. :2.00 Max. :7.000
## NA's :40038 NA's :40039 NA's :40040
## Q_NTR_Q2_1 Q_NTR_Q2_2 Q_NTR_Q2_3 Q_NTR_Q2_4
## Min. :1.00 Min. :1.00 Min. :1.00 Min. :1.00
## 1st Qu.:1.00 1st Qu.:1.00 1st Qu.:2.00 1st Qu.:2.00
## Median :2.00 Median :2.00 Median :2.00 Median :2.00
## Mean :1.68 Mean :1.63 Mean :2.03 Mean :1.96
## 3rd Qu.:2.00 3rd Qu.:2.00 3rd Qu.:2.00 3rd Qu.:2.00
## Max. :3.00 Max. :3.00 Max. :3.00 Max. :3.00
## NA's :39736 NA's :39734 NA's :39742 NA's :39740
## Q_NTR_Q2_5
## Min. :1.00
## 1st Qu.:2.00
## Median :2.00
## Mean :1.98
## 3rd Qu.:2.00
## Max. :3.00
## NA's :39744
a$E_BMI
a[,"E_BMI"]
a[,11]
#a[1:7] ## 이러면 안된다. ","로 행인지 열인지 구분을 해 줘야.
a[,1:7] ## 1열부터 7열까지.
a[,c(1,2,3,4,5,6,7)]
a[,seq(1,7)]
a[,c("PERSON_ID","EXMD_BZ_YYYY","YKIHO_GUBUN_CD","E_HGHT","E_HGHT_PCT","E_HGHT_JDG","E_WGHT")] ## 변수명으로도 가능
a[,names(a)[1:7]] ## Same
length(a$E_BMI)
## [1] 45537
a[2,11] ## 2행 11열
## [1] 34
a[2,] ## 11행
## PERSON_ID EXMD_BZ_YYYY YKIHO_GUBUN_CD E_HGHT E_HGHT_PCT E_HGHT_JDG E_WGHT
## 2 11209245 2014 37 107.9 9 1 17.5
## E_WGHT_PCT E_WGHT_JDG E_BMI E_BMI_PCT E_BMI_JDG E_VIS_Q_JDG E_AUD_Q_JDG
## 2 12 1 15 34 1 1 1
## E_DVAS_MTHD E_DVAS_JDG Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## 2 NA 1 2 3.1 1 1
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ
## 2 3 1 4 1 3
## Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## 2 1 1 1 1 1
## Q_VCC_JENC_FRQ Q_PSMK_Q1 Q_PSMK_Q2 Q_PSMK_Q3 Q_PSMK_Q4 number Q_NTR_Q2_1
## 2 3 1 2 2 1 7 NA
## Q_NTR_Q2_2 Q_NTR_Q2_3 Q_NTR_Q2_4 Q_NTR_Q2_5
## 2 NA NA NA NA
mean(a$E_BMI) ## 결측치 없을 때만..
## [1] NA
mean(a$E_BMI,na.rm=T) ## 결측치 빼고
## [1] 16.06418
round(mean(a$E_BMI,na.rm=T),2) ## 반올림
## [1] 16.06
mean(a[,11],na.rm=T)
## [1] 54.71346
sd(a$E_BMI,na.rm=T) ## 표준편차
## [1] 1.658654
var(a$E_BMI,na.rm=T) ## 분산
## [1] 2.751134
median(a$E_BMI,na.rm=T) ## 중간값
## [1] 15.9
IQR(a$E_BMI,na.rm=T) ## 25%-75% range
## [1] 1.8
quantile(a$E_BMI, na.rm=T) ## quantile
## 0% 25% 50% 75% 100%
## 5.8 15.0 15.9 16.8 55.8
max(a$E_BMI,na.rm=T) ## Max
## [1] 55.8
min(a$E_BMI,na.rm=T) ## Min
## [1] 5.8
한편, 실습 데이터는 08년-14년의 데이터를 전부 합친 것이기 때문에 특정년도에만 있는 변수들이 많다. 즉, 어떤 년도에는 전부 NA인 변수도 있다는 뜻이다(예: 08-10년은 BMI가 없다). 이를 확인해 보자. 그룹별로 살펴보는 것은 tapply
또는 aggregate
함수를 이용할 수 있다.
library(stats)
tapply(a$E_BMI,a$EXMD_BZ_YYYY,mean) ## 변수, 그룹변수, 함수
## 2008 2009 2010 2011 2012 2013 2014
## NA NA NA NA NA 16.06088 16.10955
tapply(a$E_BMI,a$EXMD_BZ_YYYY,function(x){mean(x,na.rm=T)}) ## NA 고려.
## 2008 2009 2010 2011 2012 2013 2014
## NaN NaN NaN 16.06146 16.03154 16.06088 16.10955
#aggregate(a$E_BMI,by=list(a$EXMD_BZ_YYYY),function(x){mean(x,na.rm=T)}) ## aggregate 이용
#aggregate(a$E_BMI,by=list(a$number,a$EXMD_BZ_YYYY),function(x){mean(x,na.rm=T)}) ## 그룹 동시에 지정가능
#aggregate(a[,c("E_BMI","E_WGHT","E_HGHT")],by=list(a$number,a$EXMD_BZ_YYYY),function(x){mean(x,na.rm=T)})
## 여러 변수 가능
간단한 실습을 위해 변수목록을 줄이자.
subvar=c(1:2,36,4,7,10,17:31) ## 변수번호
subvar
## [1] 1 2 36 4 7 10 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
b=a[,subvar] ## 해당 변수만..
head(b)
## PERSON_ID EXMD_BZ_YYYY number E_HGHT E_WGHT E_BMI Q_PREM Q_BTH_WGHT
## 1 10934240 2014 7 106.3 19.1 16.9 2 3.3
## 2 11209245 2014 7 107.9 17.5 15.0 2 3.1
## 3 11222323 2014 7 113.5 20.1 15.6 2 3.2
## 4 11536379 2014 7 117.0 20.2 14.8 2 2.9
## 5 11822836 2014 7 111.0 17.9 14.5 2 2.7
## 6 12020725 2014 7 105.9 18.2 16.2 1 1.8
## Q_VCC_BCG_YN Q_VCC_HBV_YN Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ
## 1 1 1 3 1 5
## 2 1 1 3 1 4
## 3 1 1 3 1 4
## 4 1 1 3 1 5
## 5 1 1 3 1 5
## 6 1 1 3 1 5
## Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN
## 1 1 4 1 2 1
## 2 1 3 1 1 1
## 3 1 3 1 2 1
## 4 1 4 1 2 1
## 5 1 4 1 2 1
## 6 1 4 1 2 1
## Q_VCC_CPOX_FRQ Q_VCC_JENC_YN Q_VCC_JENC_FRQ
## 1 1 1 3
## 2 1 1 3
## 3 1 1 3
## 4 1 1 3
## 5 1 1 3
## 6 1 1 3
subvar=names(a)[c(1:2,36,4,7,10,17:31)] ## 변수명으로 해도 똑같다.
subvar
## [1] "PERSON_ID" "EXMD_BZ_YYYY" "number" "E_HGHT"
## [5] "E_WGHT" "E_BMI" "Q_PREM" "Q_BTH_WGHT"
## [9] "Q_VCC_BCG_YN" "Q_VCC_HBV_YN" "Q_VCC_HBV_FRQ" "Q_VCC_DPT_YN"
## [13] "Q_VCC_DPT_FRQ" "Q_VCC_POLIO_YN" "Q_VCC_POLIO_FRQ" "Q_VCC_MMR_YN"
## [17] "Q_VCC_MMR_FRQ" "Q_VCC_CPOX_YN" "Q_VCC_CPOX_FRQ" "Q_VCC_JENC_YN"
## [21] "Q_VCC_JENC_FRQ"
b=a[,subvar]
이제부터는 b
데이터셋으로 실습을 진행하겠다. 결측치 현황을 살펴보면
summary(b)
## PERSON_ID EXMD_BZ_YYYY number E_HGHT
## Min. :10005819 Min. :2008 Min. :1.000 Min. : 9.30
## 1st Qu.:35800784 1st Qu.:2009 1st Qu.:2.000 1st Qu.: 73.50
## Median :57100463 Median :2011 Median :4.000 Median : 91.30
## Mean :56411261 Mean :2011 Mean :3.707 Mean : 89.72
## 3rd Qu.:77709454 3rd Qu.:2012 3rd Qu.:5.000 3rd Qu.:103.80
## Max. :99997712 Max. :2014 Max. :7.000 Max. :174.00
## NA's :12
## E_WGHT E_BMI Q_PREM Q_BTH_WGHT
## Min. : 1.10 Min. : 5.80 Min. :1.000 Min. :0.000
## 1st Qu.: 9.50 1st Qu.:15.00 1st Qu.:2.000 1st Qu.:3.000
## Median :13.20 Median :15.90 Median :2.000 Median :3.200
## Mean :13.69 Mean :16.06 Mean :1.971 Mean :3.193
## 3rd Qu.:17.00 3rd Qu.:16.80 3rd Qu.:2.000 3rd Qu.:3.500
## Max. :75.80 Max. :55.80 Max. :2.000 Max. :9.900
## NA's :28157 NA's :10617 NA's :10112
## Q_VCC_BCG_YN Q_VCC_HBV_YN Q_VCC_HBV_FRQ Q_VCC_DPT_YN
## Min. :1.000 Min. :1.000 Min. :0.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:3.000 1st Qu.:1.000
## Median :1.000 Median :1.000 Median :3.000 Median :1.000
## Mean :1.002 Mean :1.001 Mean :2.701 Mean :1.001
## 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:3.000 3rd Qu.:1.000
## Max. :2.000 Max. :2.000 Max. :7.000 Max. :2.000
## NA's :10129 NA's :10081 NA's :10213 NA's :10081
## Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ Q_VCC_MMR_YN
## Min. :0.00 Min. :1.000 Min. :0.000 Min. :1.000
## 1st Qu.:3.00 1st Qu.:1.000 1st Qu.:3.000 1st Qu.:1.000
## Median :4.00 Median :1.000 Median :3.000 Median :1.000
## Mean :3.57 Mean :1.002 Mean :2.907 Mean :1.004
## 3rd Qu.:4.00 3rd Qu.:1.000 3rd Qu.:3.000 3rd Qu.:1.000
## Max. :9.00 Max. :2.000 Max. :6.000 Max. :2.000
## NA's :10210 NA's :10463 NA's :10624 NA's :16827
## Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## Min. :0.000 Min. :1.00 Min. :0.00 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.00 1st Qu.:1.00 1st Qu.:1.000
## Median :1.000 Median :1.00 Median :1.00 Median :1.000
## Mean :1.189 Mean :1.01 Mean :0.98 Mean :1.012
## 3rd Qu.:1.000 3rd Qu.:1.00 3rd Qu.:1.00 3rd Qu.:1.000
## Max. :5.000 Max. :2.00 Max. :5.00 Max. :2.000
## NA's :17045 NA's :16832 NA's :17144 NA's :16843
## Q_VCC_JENC_FRQ
## Min. :0.000
## 1st Qu.:2.000
## Median :3.000
## Mean :2.331
## 3rd Qu.:3.000
## Max. :7.000
## NA's :17124
원활한 실습읋 위해 결측치가 없는 데이터셋을 만든 후 계속 실습을 진행하려 한다. 결측치가 없는 행이 어떤 행인지를 알아보려면
dim(b)
## [1] 45537 21
nona=complete.cases(b) ## 결측치 없으면 T, 있으면 F
table(nona)
## nona
## FALSE TRUE
## 28896 16641
c=b[nona,] ## 결측치 없는 데이터 생성.
c=na.omit(b) ## na.omit 함수를 이용하면 더 편하다.
dim(c)
## [1] 16641 21
이번에는 연속형 변수인 BMI
변수를 예시로 우리가 원하는 조건에 해당하는 정보를 뽑아내는 것을 연습해 보겠다.
mean(c$E_BMI)
## [1] 16.06117
cut= c$E_BMI >=16 ## TRUE of FALSE
table(cut)
## cut
## FALSE TRUE
## 8787 7854
rows=which(c$E_BMI >= 16) ## row numbers
head(rows)
## [1] 1 6 9 10 12 13
values=c$E_BMI[c$E_BMI>=16] ## Values
head(values)
## [1] 16.9 16.2 17.4 21.0 16.6 16.5
length(values)
## [1] 7854
BMI_HGHT_and=(c$E_BMI>=16 & c$E_HGHT>=100) ## and
BMI_HGHT_or=(c$E_BMI>=16 | c$E_HGHT>=100) ## or
table(BMI_HGHT_and)
## BMI_HGHT_and
## FALSE TRUE
## 9945 6696
table(BMI_HGHT_or)
## BMI_HGHT_or
## FALSE TRUE
## 1466 15175
이번에는 년도 변수인 EXMD_BZ_YYYY
를 예로 실습을 해 보자.
y2011 = c$EXMD_BZ_YYYY==2011
table(y2011)
## y2011
## FALSE TRUE
## 15738 903
y2011_2012 = (c$EXMD_BZ_YYYY == 2011 | c$EXMD_BZ_YYYY == 2012)
y2011_2012 = c$EXMD_BZ_YYYY %in% c(2011,2012) ## Same
table(y2011_2012)
## y2011_2012
## FALSE TRUE
## 10258 6383
class(c$EXMD_BZ_YYYY) ## continuous or categorial
## [1] "integer"
summary(c$EXMD_BZ_YYYY) ## continuous
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2011 2012 2013 2013 2014 2014
c$EXMD_BZ_YYYY=as.factor(c$EXMD_BZ_YYYY) ## continuous -> categorial
summary(c$EXMD_BZ_YYYY)
## 2011 2012 2013 2014
## 903 5480 5682 4576
kk=as.numeric(c$EXMD_BZ_YYYY) ## NONONONO
summary(kk)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.837 4.000 4.000
c$EXMD_BZ_YYYY=as.numeric(as.character(c$EXMD_BZ_YYYY)) ## OK
summary(c$EXMD_BZ_YYYY)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2011 2012 2013 2013 2014 2014
사실 가장 앞에 나와야 할 내용인데 class
의 개념이 나와야 해서 이제야 언급하게 되었다. 데이터를 받으면 가장 먼저 해야할 것은 연속형, 범주형 변수를 설정해 주는 것이다. Feamle, Male 등 이미 변수가 범주로 되어 있다면 상관이 없겠지만, 그렇지 않고 0,1로 되어있을 때는 숫자형으로 되어있는게 default이기 때문이다. 데이터셋 c
로 연습해보자. 년도, 차수,키, 몸무게, BMI와 접종횟수를 연속변수로 보고 나머지는 범주형으로 보는 것으로 하자.
conti_var=c(2:6,8,seq(11,21,2)) ## 키, 몸무게, BMI, freq variable
cat_var= which(!(1:ncol(c) %in% conti_var)) ## !: Not
cat_var
## [1] 1 7 9 10 12 14 16 18 20
for (vn in conti_var){
c[,vn]=as.numeric(c[,vn])
}
for (vn in cat_var){
c[,vn]=as.factor(c[,vn])
}
summary(c)
## PERSON_ID EXMD_BZ_YYYY number E_HGHT E_WGHT
## 10033697: 3 Min. :2011 Min. :5.000 Min. : 86.0 Min. : 1.7
## 10035928: 3 1st Qu.:2012 1st Qu.:5.000 1st Qu.:102.0 1st Qu.:16.3
## 10061169: 3 Median :2013 Median :6.000 Median :107.1 Median :18.0
## 10072608: 3 Mean :2013 Mean :5.985 Mean :107.3 Mean :18.6
## 10080964: 3 3rd Qu.:2014 3rd Qu.:7.000 3rd Qu.:112.4 3rd Qu.:20.3
## 10083933: 3 Max. :2014 Max. :7.000 Max. :131.3 Max. :49.0
## (Other) :16623
## E_BMI Q_PREM Q_BTH_WGHT Q_VCC_BCG_YN Q_VCC_HBV_YN
## Min. : 8.40 1: 432 Min. :0.100 1:16591 1:16637
## 1st Qu.:15.00 2:16209 1st Qu.:3.000 2: 50 2: 4
## Median :15.90 Median :3.200
## Mean :16.06 Mean :3.202
## 3rd Qu.:16.80 3rd Qu.:3.500
## Max. :49.30 Max. :5.900
##
## Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ
## Min. :0.00 1:16636 Min. :0.000 1:16637 Min. :0.000
## 1st Qu.:3.00 2: 5 1st Qu.:4.000 2: 4 1st Qu.:3.000
## Median :3.00 Median :4.000 Median :3.000
## Mean :2.88 Mean :4.151 Mean :3.253
## 3rd Qu.:3.00 3rd Qu.:5.000 3rd Qu.:4.000
## Max. :7.00 Max. :9.000 Max. :6.000
##
## Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN Q_VCC_CPOX_FRQ Q_VCC_JENC_YN
## 1:16634 Min. :0.000 1:16622 Min. :0.000 1:16626
## 2: 7 1st Qu.:1.000 2: 19 1st Qu.:1.000 2: 15
## Median :1.000 Median :1.000
## Mean :1.381 Mean :1.042
## 3rd Qu.:2.000 3rd Qu.:1.000
## Max. :5.000 Max. :5.000
##
## Q_VCC_JENC_FRQ
## Min. :0.000
## 1st Qu.:2.000
## Median :3.000
## Mean :2.648
## 3rd Qu.:3.000
## Max. :6.000
##
지금까지 배운 것을 토대로 간단히 새로운 변수를 만들 수 있다.
c$BMI_cat=0 ## 0으로 된 변수만들고
c$BMI_cat[c$E_BMI>=16]=1 ## 16이상인 것만 1로 바꾼다.
table(c$BMI_cat)
##
## 0 1
## 8787 7854
c$BMI_cat= c$E_BMI>=16 ## 방법 2: TRUE of FALSE
table(c$BMI_cat)
##
## FALSE TRUE
## 8787 7854
c$BMI_cat= ifelse(c$E_BMI>=16,"1","0") ## 방법 3: ifelse문 이용
table(c$BMI_cat)
##
## 0 1
## 8787 7854
정렬에는 order
함수가 사용된다.
ord=order(c$E_BMI) ## 작은순서대로 Rank
head(c$E_BMI[ord])
## [1] 8.4 10.7 11.0 11.6 11.7 11.8
ord2=order(-c$E_BMI) ## 큰순서대로 Rank
tail(c$E_BMI[ord2])
## [1] 11.8 11.7 11.6 11.0 10.7 8.4
d=c[ord,] ## 콤마 앞에 즉, 행에 순서변수를 넣는다.
head(d)
## PERSON_ID EXMD_BZ_YYYY number E_HGHT E_WGHT E_BMI Q_PREM Q_BTH_WGHT
## 2574 68204183 2014 7 118.3 11.8 8.4 2 3.3
## 9167 78509257 2013 6 103.0 11.4 10.7 2 3.1
## 9315 80696645 2013 6 120.6 16.0 11.0 2 3.7
## 16720 16551997 2011 5 91.5 9.7 11.6 2 2.7
## 13511 57691599 2012 5 99.4 11.6 11.7 2 2.7
## 4959 16551997 2013 7 101.8 12.2 11.8 2 2.7
## Q_VCC_BCG_YN Q_VCC_HBV_YN Q_VCC_HBV_FRQ Q_VCC_DPT_YN Q_VCC_DPT_FRQ
## 2574 1 1 3 1 5
## 9167 1 1 3 1 4
## 9315 1 1 3 1 4
## 16720 1 1 3 1 4
## 13511 1 1 3 1 4
## 4959 1 1 3 1 4
## Q_VCC_POLIO_YN Q_VCC_POLIO_FRQ Q_VCC_MMR_YN Q_VCC_MMR_FRQ Q_VCC_CPOX_YN
## 2574 1 4 1 1 1
## 9167 1 3 1 1 1
## 9315 1 3 1 1 1
## 16720 1 3 1 1 1
## 13511 1 3 1 1 1
## 4959 1 3 1 1 1
## Q_VCC_CPOX_FRQ Q_VCC_JENC_YN Q_VCC_JENC_FRQ BMI_cat
## 2574 1 1 3 0
## 9167 1 1 3 0
## 9315 1 1 3 0
## 16720 1 1 2 0
## 13511 1 1 2 0
## 4959 1 1 3 0
특정 조건을 만족하는 부분 데이터셋을 만드는 것은 지금까지 배웠던 것을 응용할 수도 있고 subset
이라는 함수를 쓸 수도 있다.
d=c[c$EXMD_BZ_YYYY %in% 2013:2014,] ## 행에 조건 써준다.
d=subset(c, EXMD_BZ_YYYY %in% 2013:2014) ## 문법이 간단하여 이것을 주로 쓴다.
Merge는 merge
함수를 이용한다. 실습을 위해 데이터셋 c
를 두 개의 데이터셋으로 나눈 후 합쳐보겠다.
d=c[,1:6] ## 기본정보 + 연속형변수
e=c[,c(1:3,7:21)] ## 기본정보 + 범주형변수
c=merge(d,e,by=c("PERSON_ID","EXMD_BZ_YYYY","number"), all=F) ##all=T로 하면 안겹치는 것도 NA포함해서 만듦.
이제부터는 실전에서 기술통계량 즉, 테이블 1을 간단히 만드는 방법을 연습해 보겠다. moonBook, ztable
패키지를 미리 설치하자.
#install.packages(c("moonbook","ztable"))
library(moonBook);library(ztable)
options(ztable.type="html")
tb1=mytable(EXMD_BZ_YYYY ~ E_HGHT+E_WGHT+E_BMI +Q_PREM+Q_BTH_WGHT+Q_VCC_BCG_YN, data=c, digits=2) ## 그룹변수 ~ 설명변수
ztable(tb1)
p | |||||
---|---|---|---|---|---|
(N=903) | (N=5480) | (N=5682) | (N=4576) | ||
E_HGHT | 99.93 ± 3.52 | 101.70 ± 4.52 | 108.42 ± 4.84 | 114.00 ± 4.58 | < 0.001 |
R의 큰 장점 중 하나는 수려한 그래픽이다. 본 실습에서 많은 부분은 할 수 없지만 기본적인 그림, 여러 그림 동시에 그리기 등 옵션들, 상관관계 그림을 알아보도록 하겠다.
hist(c$E_BMI,main="Histogram: BMI",xlab="BMI")
hist(c$E_BMI,main="Histogram: BMI",xlab="BMI",breaks=10,freq=F)
boxplot(c$E_BMI,main="Boxplot: BMI",ylab="BMI")
boxplot(E_BMI~EXMD_BZ_YYYY,data=c, main="BMI per year", ylab="BMI")
plot(c$E_BMI,c$E_HGHT, xlab="BMI", ylab="Height")
plot(c[,4:6])
par(mfrow=c(2,2)) ## 2*2 그림 (상 -> 하), mfcol: 좌 -> 우
hist(c[,4])
hist(c[,5])
hist(c[,6])
hist(c[,3])
library(lattice)
xyplot(E_BMI~E_HGHT|EXMD_BZ_YYYY,data=c, main="Plot per year")
library(Hmisc)
rcorr(as.matrix(c[,4:6]))
## E_HGHT E_WGHT E_BMI
## E_HGHT 1.00 0.8 0.15
## E_WGHT 0.80 1.0 0.70
## E_BMI 0.15 0.7 1.00
##
## n= 16641
##
##
## P
## E_HGHT E_WGHT E_BMI
## E_HGHT 0 0
## E_WGHT 0 0
## E_BMI 0 0
rcorr(as.matrix(c[,4:6]),type="spearman")
## E_HGHT E_WGHT E_BMI
## E_HGHT 1.00 0.85 0.09
## E_WGHT 0.85 1.00 0.57
## E_BMI 0.09 0.57 1.00
##
## n= 16641
##
##
## P
## E_HGHT E_WGHT E_BMI
## E_HGHT 0 0
## E_WGHT 0 0
## E_BMI 0 0
##intstall.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
chart.Correlation(c[,4:6],pch="+",main="Correlation plot") ## histogram=F, method="spearman" 옵션가능
pdf("fig1.pdf",h=7,w=10) ## h: height, w: width(inch)
hist(c[,4])
dev.off()
## png
## 2
png("fig1.png",h=480,w=640) ## h: height, w: width(pixel)
hist(c[,4])
dev.off()
## png
## 2
수고하셨습니다!! 질문은 secondmath85@gmail 로 주시면 감사하겠습니다
Copyright ©2016 Jinseob Kim