Most usable packages in real projects

cloud

  1. ProjectTemplate 패키지
  2. ggplot2 패키지
  3. plyr, data.table 패키지
  4. reshape2 패키지
  5. lubridate 패키지
  6. knitr, markdown 패키지

ProjectTemplate



library(ProjectTemplate)
create.project("bicdata")
setwd("bicdata/")
load.project()

# copy titanic to data dir
titanic <- read.csv("http://dl.dropbox.com/u/8686172/titanic.csv")
write.csv(titanic, file = "data/titanic.csv")

load.project()

# modify munging process modify config file

# load.project()

show.project()

stub.tests()

# needs to be modified to 'test-*.R'
test.project()
# if logging : on
warn(logger, "This is warning")
scan("logs/project.log", what = "character")

ggplot2

library(ggplot2)

# 서로 다른 표현
qplot(carat, price, data = diamonds, geom = "point", colour = clarity)  # (1)

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = carat, y = price)) + geom_point(aes(colour = clarity))  # (2)

plot of chunk ggplot2


# 매핑 정보 및 각종 정보들을 보여줌
s <- ggplot(data = diamonds, aes(x = carat, y = price))
summary(s)
data: carat, cut, color, clarity, depth, table, price, x, y, z
  [53940x10]
mapping:  x = carat, y = price
faceting: facet_null() 

# 미적 요소 매핑의 오버라이딩
ggplot(data = diamonds, aes(x = carat, y = price)) + geom_point(aes(colour = clarity)) + 
    geom_smooth()  #  (1)

plot of chunk ggplot2


ggplot(data = diamonds, aes(x = carat, y = price, colour = clarity)) + geom_point() + 
    geom_smooth()  #  (2)

plot of chunk ggplot2


# set기능으로 색상 적용
# http://research.stowers-institute.org/efg/R/Color/Chart/
ggplot(data = diamonds, aes(x = carat, y = price, colour = clarity)) + geom_point(colour = "darkblue")

plot of chunk ggplot2


# group 매핑
p <- ggplot(data = diamonds, aes(x = carat, y = price))
p + geom_smooth()  #  (1)

plot of chunk ggplot2

p + geom_smooth(aes(group = clarity))  #  (2)

plot of chunk ggplot2


# geom과 stat 객체
ggplot(data = diamonds, aes(x = price)) + geom_bar()  #  (1)

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(y = ..count..))  #  (2)

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(y = ..density..))

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(y = ..ncount..))

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(y = ..ndensity..))

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(y = ..density..)) + ylab("밀도")

plot of chunk ggplot2



# 위치 조정

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(fill = cut), binwidth = 3000)

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(fill = cut), binwidth = 3000, 
    position = "dodge")

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(fill = cut), binwidth = 3000, 
    position = "fill")

plot of chunk ggplot2


# facet
ggplot(data = diamonds, aes(x = price)) + geom_bar(binwidth = 3000) + facet_grid(. ~ 
    cut)

plot of chunk ggplot2

ggplot(data = diamonds, aes(x = price)) + geom_bar(binwidth = 3000) + facet_wrap(~cut, 
    nrow = 3)

plot of chunk ggplot2


# geom과 stat의 결합
d <- ggplot(diamonds, aes(price))
d + stat_bin(geom = "bar")

plot of chunk ggplot2

d + stat_bin(geom = "area")

plot of chunk ggplot2

d + stat_bin(aes(size = ..ndensity..), geom = "point")

plot of chunk ggplot2

d + stat_bin(aes(y = 1, fill = ..density..), geom = "tile")

plot of chunk ggplot2




# 레이블 및 텍스트
ggplot(data = diamonds, aes(x = price)) + geom_bar(aes(fill = cut), binwidth = 3000, 
    position = "fill") + xlab("가격") + ylab("빈도") + scale_fill_discrete("커팅") + 
    theme(axis.text.x = element_text(angle = 90, vjust = 0.4))

plot of chunk ggplot2

plyr, data.table

예)

split_apply

library(ggplot2)
library(plyr)

market_price <- read.csv("http://dl.dropbox.com/u/8686172/marketprice.csv", 
    fileEncoding = "UTF-8")



# ggplot(market_price, aes(x=A_NAME, y=A_PRICE, colour=M_TYPE_NAME)) +
# geom_boxplot(outlier.size=0) +
# stat_summary(aes(group=M_TYPE_NAME),fun.y='mean', geom='line', size=1,
# alpha=I(0.7))+ opts(axis.text.x=theme_text(angle=90))

ddply(market_price, .(A_NAME, M_TYPE_NAME), summarize, mean_price = mean(A_PRICE))
                   A_NAME M_TYPE_NAME mean_price
1                  고등어    대형마트     1000.0
2       고등어(30cm,국산)    대형마트     5448.3
3       고등어(30cm,국산)    전통시장     3166.7
4       고등어(냉동,국산)    대형마트     3112.5
5       고등어(냉동,국산)    전통시장     3443.7
6     고등어(냉동,수입산)    대형마트     1500.0
7     고등어(냉동,수입산)    전통시장     1666.7
8       고등어(생물,국산)    대형마트     4597.3
9       고등어(생물,국산)    전통시장     3290.2
10    고등어(생물,수입산)    전통시장     1500.0
11  냉동참조기(20cm,국산)    대형마트      943.3
12                   달걀    대형마트     2464.9
13                   달걀    전통시장     2500.0
14             달걀(왕란)    대형마트     2613.2
15             달걀(왕란)    전통시장     2316.9
16             달걀(특란)    대형마트     2130.0
17             달걀(특란)    전통시장     2225.0
18                 닭고기    대형마트     6339.1
19                 닭고기    전통시장     5920.0
20           닭고기(육계)    대형마트     7980.6
21           닭고기(육계)    전통시장     5432.0
22           닭고기(중간)    대형마트     3480.0
23                   동태    대형마트      906.7
24                   동태    전통시장     5480.0
25       돼지고기(삼겹살)    대형마트    13595.0
26       돼지고기(삼겹살)    전통시장    12785.2
27     돼지고기(생삼겹살)    대형마트    14838.2
28     돼지고기(생삼겹살)    전통시장    11803.8
29                   명태    대형마트     1207.7
30                   명태    전통시장     1500.0
31        명태(45cm,국산)    대형마트        0.0
32      명태(45cm,수입산)    대형마트     2095.6
33      명태(45cm,수입산)    전통시장     2816.5
34      명태(냉동,수입산)    대형마트     2377.9
35      명태(냉동,수입산)    전통시장     3230.8
36      명태(러시아,냉동)    대형마트     2285.9
37      명태(러시아,냉동)    전통시장     2100.0
38      명태(생물,수입산)    대형마트      553.5
39      명태(생물,수입산)    전통시장     2555.6
40                     무    대형마트     1721.5
41                     무    전통시장     1462.1
42                무(1kg)    대형마트     1900.0
43                무(1kg)    전통시장     1532.9
44             무(세척무)    대형마트     2181.3
45             무(세척무)    전통시장     1444.4
46         무(세척무, 중)    대형마트     1828.3
47                     배    대형마트     4221.8
48                     배    전통시장     2888.9
49               배(신고)    대형마트     5185.8
50               배(신고)    전통시장     3795.5
51      배(신고),중급(대)    대형마트     3033.3
52         배(신고, 600g)    대형마트     4368.6
53         배(신고, 600g)    전통시장     3083.8
54               배(중품)    대형마트     3705.3
55               배(중품)    전통시장     2944.4
56          배(중품),신고    대형마트     2186.7
57          배(중품),신고    전통시장     2875.0
58                   배추    대형마트     2314.9
59                   배추    전통시장     2642.1
60          배추(2.5~3kg)    대형마트     2750.2
61          배추(2.5~3kg)    전통시장     2835.2
62             배추(국산)    대형마트     2836.7
63             배추(중간)    대형마트     2318.3
64             배추(중간)    전통시장     2203.4
65                   사과    대형마트     2659.5
66                   사과    전통시장     2792.9
67             사과(부사)    대형마트     2052.8
68             사과(부사)    전통시장     2575.4
69    사과(부사),중급(중)    대형마트     1650.0
70       사과(부사, 300g)    대형마트     3053.1
71       사과(부사, 300g)    전통시장     2530.7
72             사과(중품)    대형마트     2682.9
73             사과(중품)    전통시장     2541.7
74                 삼겹살    전통시장    12500.0
75                   상추    대형마트     1336.5
76                   상추    전통시장      803.5
77             상추(100g)    대형마트     1077.7
78             상추(100g)    전통시장      549.6
79                   생닭    전통시장     6000.0
80                 쇠고기    대형마트    21120.0
81           쇠고기(등심)    전통시장    11800.0
82    쇠고기(육우,불고기)    대형마트    25200.0
83    쇠고기(육우,불고기)    전통시장    17325.0
84    쇠고기(한우,불고기)    대형마트    20438.5
85    쇠고기(한우,불고기)    전통시장    17928.4
86      쇠고기(한우1등급)    대형마트    18190.6
87      쇠고기(한우1등급)    전통시장    17800.0
88      쇠고기(한우2등급)    대형마트    14320.0
89      쇠고기(한우2등급)    전통시장    14400.0
90                 애호박    대형마트      963.7
91                 애호박    전통시장      587.1
92                   양파    대형마트     3104.0
93                   양파    전통시장     2246.7
94          양파(1.5kg망)    대형마트     3286.3
95          양파(1.5kg망)    전통시장     2226.2
96           양파(작은망)    대형마트     3161.5
97           양파(작은망)    전통시장     2389.8
98                   오이    대형마트      449.8
99                   오이    전통시장      362.9
100          오이(다다기)    대형마트      483.7
101          오이(다다기)    전통시장      352.4
102                오징어    대형마트     2020.0
103                오징어    전통시장     1660.0
104          오징어(냉동)    대형마트     1730.0
105          오징어(냉동)    전통시장     1583.3
106     오징어(냉동,국산)    대형마트     1930.2
107     오징어(냉동,국산)    전통시장     2340.5
108   오징어(냉동,수입산)    대형마트     1786.7
109     오징어(생물,국산)    대형마트     2332.8
110     오징어(생물,국산)    전통시장     2145.7
111   오징어(생물,수입산)    대형마트     1680.0
112                  조기    대형마트     7250.0
113                  조기    전통시장     2842.9
114       조기(국산,냉동)    대형마트     4342.4
115       조기(국산,냉동)    전통시장     1546.6
116       조기(국산,생물)    대형마트     3677.9
117       조기(국산,생물)    전통시장     2379.3
118       조기(냉동,국산)    대형마트     2077.4
119       조기(냉동,국산)    전통시장     1775.8
120     조기(냉동,수입산)    대형마트     4537.5
121     조기(냉동,수입산)    전통시장     3429.3
122       조기(생물,국산)    대형마트     4226.0
123       조기(생물,국산)    전통시장     1663.5
124     조기(생물,수입산)    대형마트     2980.0
125     조기(중국산,생물)    전통시장     4333.3
126                  호박    대형마트      694.4
127                  호박    전통시장      534.9
128      호박(인큐베이터)    대형마트      821.1
129      호박(인큐베이터)    전통시장      779.1
# 멀티코어사용

library(doSNOW)
cl <- makeCluster(c("localhost", "localhost"), type = "SOCK")
registerDoSNOW(cl)

system.time({
    a1 <- ddply(market_price, .(A_NAME, M_TYPE_NAME), summarize, mean_price = mean(A_PRICE))
})

system.time({
    a2 <- ddply(market_price, .(A_NAME, M_TYPE_NAME), summarize, mean_price = mean(A_PRICE), 
        .parallel = TRUE)
})

stopCluster(cl)


# for Linux on my case
library(doMC)
registerDoMC()

system.time({
    a3 <- ddply(market_price, .(A_NAME, M_TYPE_NAME), summarize, mean_price = mean(A_PRICE), 
        .parallel = TRUE)
})

data.table

library(data.table)

market_price.dt <- data.table(market_price)  #--- (1)

market_price.dt[2, list(M_NAME)]  #--- (2)
         M_NAME
1: 대림중앙시장

market_price[2, "M_NAME", drop = F]
        M_NAME
2 대림중앙시장

market_price.dt[, list(avg = mean(A_PRICE)), by = list(M_TYPE_NAME, A_NAME)]
     M_TYPE_NAME              A_NAME  avg
  1:    전통시장          사과(부사) 2575
  2:    전통시장            배(신고) 3796
  3:    전통시장          배추(중간) 2203
  4:    전통시장          무(세척무) 1444
  5:    전통시장        양파(작은망) 2390
 ---                                     
125:    전통시장              오징어 1660
126:    대형마트 고등어(냉동,수입산) 1500
127:    대형마트              고등어 1000
128:    전통시장 고등어(생물,수입산) 1500
129:    대형마트 오징어(생물,수입산) 1680


setkey(market_price.dt, A_NAME)
market_price.dt["고등어"]
   A_NAME  P_SEQ M_SEQ          M_NAME A_SEQ      A_UNIT A_PRICE
1: 고등어 301107    22 이마트 여의도점    13 1마리(30cm)    1000
   P_YEAR_MONTH ADD_COL M_TYPE_CODE M_TYPE_NAME M_GU_CODE M_GU_NAME
1:       May-12  작은것           2    대형마트    560000  영등포구
head(market_price.dt)
    P_SEQ M_SEQ            M_NAME A_SEQ            A_NAME       A_UNIT
1: 301107    22   이마트 여의도점    13            고등어  1마리(30cm)
2: 316758    14      장위골목시장   316 고등어(30cm,국산) 1마리 (30cm)
3: 317556    56        롯데백화점   316 고등어(30cm,국산)        1마리
4: 317700    72          금남시장   316 고등어(30cm,국산)        1마리
5: 317748    74   이마트 왕십리점   316 고등어(30cm,국산)  1마리(30cm)
6: 318452    16 현대백화점 미아점   316 고등어(30cm,국산)        1마리
   A_PRICE P_YEAR_MONTH         ADD_COL M_TYPE_CODE M_TYPE_NAME M_GU_CODE
1:    1000       May-12          작은것           2    대형마트    560000
2:    2500       Jul-12                           1    전통시장    290000
3:    7000       Jul-12 국내산제주)행사           2    대형마트    140000
4:    6000       Jul-12                           1    전통시장    200000
5:    2980       Jul-12                           2    대형마트    200000
6:    5000       Jul-12            냉동           2    대형마트    290000
   M_GU_NAME
1:  영등포구
2:    성북구
3:      중구
4:    성동구
5:    성동구
6:    성북구
setkey(market_price.dt)


market_price.dt[A_NAME == "고등어", ]
    P_SEQ M_SEQ          M_NAME A_SEQ A_NAME      A_UNIT A_PRICE
1: 301107    22 이마트 여의도점    13 고등어 1마리(30cm)    1000
   P_YEAR_MONTH ADD_COL M_TYPE_CODE M_TYPE_NAME M_GU_CODE M_GU_NAME
1:       May-12  작은것           2    대형마트    560000  영등포구
# market_price.dt['고등어']
head(market_price.dt)
    P_SEQ M_SEQ       M_NAME A_SEQ           A_NAME     A_UNIT A_PRICE
1: 299094   145 마천중앙시장   305 사과(부사, 300g)        1개    1995
2: 299095   145 마천중앙시장   306   배(신고, 600g)        1개    3266
3: 299096   145 마천중앙시장   307    배추(2.5~3kg)      1포기    2650
4: 299097   145 마천중앙시장    25               무   1개(1kg)     730
5: 299098   145 마천중앙시장   309    양파(1.5kg망) 1망(1.5kg)    2380
6: 299099   145 마천중앙시장   310       상추(100g)        1봉     980
   P_YEAR_MONTH    ADD_COL M_TYPE_CODE M_TYPE_NAME M_GU_CODE M_GU_NAME
1:       May-12 4개 7980원           1    전통시장    710000    송파구
2:       May-12 3개 9800원           1    전통시장    710000    송파구
3:       May-12                      1    전통시장    710000    송파구
4:       May-12                      1    전통시장    710000    송파구
5:       May-12    햇양파            1    전통시장    710000    송파구
6:       May-12       150g           1    전통시장    710000    송파구

reshape2


library(reshape2)

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

iris.melt <- melt(iris, id = "Species", value.name = "cm")

head(iris.melt)
  Species     variable  cm
1  setosa Sepal.Length 5.1
2  setosa Sepal.Length 4.9
3  setosa Sepal.Length 4.7
4  setosa Sepal.Length 4.6
5  setosa Sepal.Length 5.0
6  setosa Sepal.Length 5.4

ggplot(iris.melt, aes(Species, cm)) + geom_point(aes(colour = variable)) + scale_color_discrete("Species")

plot of chunk reshape2

lubridate

library(lubridate)

as.POSIXct("2012-12-12")
as.POSIXct("20121212", format = "%Y%m%d")

Sys.getlocale("LC_TIME")
# [1] 'Korean_Korea.949'

ymd("2013-01-03")
# 다음에 오류gsub('+', '*', fixed = T, gsub('>', '_e>', num)) :
# '<ec><98><a4>?<84>|<ec>삤<ed>썑)(?![[:alpha:]]))|((?<h_f_e>2[0-4]|[01]?\d)\D+(?<m_f_e>[0-5]?\d)\D+((?<os_f_s_e>[0-5]?\d\.\d+)|(?<s_f_e>[0-6]?\d))))'에
# 잘못된 멀티 바이트 문자가 있습니다

Sys.setlocale("LC_TIME", "C")
# [1] 'C'
ymd("2013-01-03")
# 1 parsed with %Y-%m-%d [1] '2013-01-03 UTC'



Sys.setlocale("LC_TIME", "Korean_Korea.949")
format(Sys.time(), "%a %b %d %X %Y %Z")
# [1] '목 1 03 오후 2:26:21 2013 KST'

Sys.setlocale("LC_TIME", "C")
format(Sys.time(), "%a %b %d %X %Y %Z")
# [1] 'Thu Jan 03 14:26:34 2013 KST'
library(lubridate)

x <- c(20090101, "2009-01-02", "2009 01 03", "2009-1-4", "2009-1, 5", "Created on 2009 1 6", 
    "200901 !!! 07")
y <- ymd(x)


y
[1] "2009-01-01 UTC" "2009-01-02 UTC" "2009-01-03 UTC" "2009-01-04 UTC"
[5] "2009-01-05 UTC" "2009-01-06 UTC" "2009-01-07 UTC"

y + days(1) + hours(6) + minutes(30)
[1] "2009-01-02 06:30:00 UTC" "2009-01-03 06:30:00 UTC"
[3] "2009-01-04 06:30:00 UTC" "2009-01-05 06:30:00 UTC"
[5] "2009-01-06 06:30:00 UTC" "2009-01-07 06:30:00 UTC"
[7] "2009-01-08 06:30:00 UTC"

y - months(12)
[1] "2008-01-01 UTC" "2008-01-02 UTC" "2008-01-03 UTC" "2008-01-04 UTC"
[5] "2008-01-05 UTC" "2008-01-06 UTC" "2008-01-07 UTC"

knitr, markdown

library(knitr)

knit("bicdata.Rmd", encoding = "UTF-8")

purl("bicdata.Rmd", encoding = "UTF-8")
system("pandoc -o bicdata.docx bicdata.md")

윈도우 작업시 주의사항

마지막 예제