12월, 2014의 게시물 표시

날짜 데이터 계열 맞춰서 Plotting

가지고 있는 데이터가 2009년 7월, 2009년 9월, 2010년 1월, 2월 이렇게 중간이 휑~하게 비어 있는 꼴이라면 대체 어떻게 plotting해야 하나요? 데이터가 data$value라면 > plot(data$value, type='l') 이렇게 할 것인데... 선 그래프가 2009년 7월 9월, 2010년 1월, 2월 이렇게 4개만 출력해줍니다. 그 사이 값은 0인데, 즉 2009년 8월=0, 2009년 10월=0, 11월=0, 12월=0 이런 식입니다만, 그래프 값에 이 0은 찍히지 않습니다. 이 문제를 어떻게 해야 하나? > x_t0 <- as.POSIXlt(data$ts_posix) 이렇게 하여 ts_posix이라는 컬럼에서 POSIX 개체를 가져와서 as.POSIXlt로 list time 객체를 만들었다고 하지요. 계열을 만드는 것은 쉽습니다. > a <- as.POSIXlt(seq(min(x_t0),max(x_t0),"mon")) > x_t1 <- paste(a$year+1900,a$mon+1,sep="-") 짜잔~ 이제 년도와 월별 계열이 나왔습니다. > yy <- numeric(length(x_t1)) 이렇게 함으로써 0 값을 가지는 yy 수열을 만듭니다. > x_t <- paste(x_t0$year+1900,x_t0$mon+1,sep="-") > y <- tapply(data$value,x_t,mean) 데이터의 value 열을 년월 기준으로 평균을 취해서 y를 구합니다. > y <- y[order(names(y))] 이렇게 순서를 맞춰주고... > yy[names(y)] <- y yy값에 lookup하면 ~ 끝. > plot(yy, type='l') 원하는 플롯을 그립니다.

R에서 시각 데이터 처리

R은 날짜 시각 데이터를 아주 편리하게 처리할 수 있도록 POSIXlt와 POSIXct 클래스를 두고 있습니다. POSIX (Portable Operating System Interfaces: 포직스)는 UNIX 간 소통 가능한 프로그램 인터페이스의 규약입니다. 뒤에 있는 "lt"는 list time, "ct"는 continuous time이고 우리가 주로 다룰 것은 lt입니다. 정리하면 POSIX + lt -> POSIXlt, POSIX + ct -> POSIXct 이렇습니다. > Sys.time() [1] "2014-12-24 11:32:53 KST" > as.numeric(Sys.time()) [1] 1419388383  현재 시각을 출력했고, 이를 1970년 1월 1일 기준, 초 단위로 변경하였습니다. > class(Sys.time()) [1] "POSIXct" "POSIXt" 클래스를 보면 POSIXt라고 나올텐데 POSIXlt를 의미합니다. ㅋㅋ > time.list <- as.POSIXlt(Sys.time()) > unlist(time.list)       sec       min      hour      mday       mon      year      wday      yday     isdst  58.80141  33.00000  11.00000  24.00000  11.00000 114.00000   3.00000 357.00000   0.00000 POSIXlt의 내용을 살펴보면 sec : 그냥 초 min : 그냥 분 hour : 그냥 시간 mday: 1일을 1로 mon: 1월을 0으로 year : 1900년을 0으로 wday: 일요일이 0으로 yday : 1월 1일이 0으로 isdst : 서머타임 > x <- c(3,1,6,7,8,9)

Density plot

이미지
도수 table을 이산으로 표시하는 것은 앞서 해 봤습니다. 이번에는 density plot(도수의 전체 합을 1로 했을 경우 각각의 예상 분포)을 그려봅시다. 그린 다음에 아랫부분을 붉게 채워보겠습니다. > x1 <- rep(c(0,1,2,3,4,5,6),c(7,14,13,8,4,2,2)) > plot(table(x1),xlab='x1',ylab='frequency',main='test',type='h',lwd=10) > plot(density(x1),xlab='x1',ylab="density",col="red") > polygon(density(x1),col='red',border='red') 결과는 density()로 밀도를 구하고 이를 plot으로 그립니다. 이후 polygon을 써서 density의 모든 영역을 촘촘히 색칠합니다. col : 색상 border : 경계 색상

Table plot

이미지
도수분포를 표시하는 table을 plot에 넣으면 결과를 막대 그래프로 볼 수 있습니다. > x1 <- rep(c(0,1,2,3,4,5,6),c(7,14,13,8,4,2,2)) > plot(table(x1),xlab='x1',ylab='frequency',main='test',type='h',lwd=10) plot 안의 table()이 도수표를 만듭니다. rep() 함수에서 지정했다시피, 0부터 6까지는 각각 7개, 14개, 14개, 8개, 4개, 2개, 2개의 도수를 가집니다. plot의 다른 옵션도 좀 보지요. xlab : x축 label ylab : y축 label main : main title type : 플롯타입 lwd : 라인의 넓이(width) 결과는 다음과 같습니다.

R plot 폰트 교체 (PDF 출력 가정)

R의 기본 폰트 이외에 논문에서는 다양한 폰트를 써야 할 경우가 있습니다. 어떤 경우에는 plot에 쓸 폰트를 정해주기도 합니다. > install.packages("extrafont") 설치한 다음 > library(extrafont) > font_import() 한참 시간이 걸리고, 또한 중간에 에러 및 경고도 뜨는데 일단 다 수락 무시하고 진행합니다. 대략 1시간 남짓 걸리니 다른 작업을 하면서 하세요. > library(extrafont) > loadfonts() 이제 폰트를 PDF 변환기에 등록합니다. 이 작업은 한번만 하면 됩니다. 역시 시간이 좀 걸립니다. 한 10분 정도? 예를 들어서 하나만 그려보지요. > library(extrafont) > pdf("c:/plot_test_new_font.pdf", width=6, height=6, family="Garamond") > plot(c(1:10),c(1:10)) > dev.off() 예에서 Garamond 폰트를 썼습니다. family 옵션으로 PDF의 출력 폰트를 정해줄 수 있습니다. 처음 PDF를 돌리면 unknown AFM... 어쩌고 에러가 나오지만 무시하고 쓰면 됩니다. ggplot2에서는 자체에 폰트 설정 기능이 내장되어 있습니다만 R의 기본 plot 툴은 이렇게 PDF 출력을 생각하고 만들었습니다. 참고로 PDF를 그림으로 변환하기 위해서 http://pdf2png.com/

R용 Search Engine!

RSeek.org라는 사이트가 있습니다. R 관련 정보를 검색하는 일에 꽤나 유용합니다. 사이트 바로가기