factor

factorの使い方というのを勉強したので使ってみる。
 
数値を適当なところで区切る。

x <- runif(10)
bin <- seq(0, 1, by=0.1)
cut(x, bin, labels = FALSE)
cut(x, bin)
cut(x, bin, labels = FALSE) #各項が何番目の区切りに入るか
 [1] 2 5 3 1 4 8 9 7 9 1
cut(x, bin) #その区切りのラベル
 [1] (0.1,0.2] (0.4,0.5] (0.2,0.3] (0,0.1]   (0.3,0.4] (0.7,0.8] (0.8,0.9]
 [8] (0.6,0.7] (0.8,0.9] (0,0.1]
10 Levels: (0,0.1] (0.1,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] ... (0.9,1]

これを使うと、どの区間にどれだけの要素が存在するかがわかる。

x <- runif(100000)
bin <- seq(0, 1, by=0.1)
table(cut(x, bin, labels = FALSE))
    1     2     3     4     5     6     7     8     9    10
 9978 10214  9809  9948  9940 10201  9982  9976  9946 10006

 
サンプルs_1,s_2,\dotsのそれぞれの検査t_1,t_2,\dotsの最新データの平均値が欲しいとする。

# レコード数の指定
n.record <- 1000
# サンプルIDを作成(文字列にすることでファクター化)
samples <- paste("s",1:10,sep="")
# 検査IDを作成
tests <- paste("t",1:3,sep="")
# データフレームに納める
# 検査時刻はSys.Date()により今日の日付を作り、それに整数を加えることで異なる日付とする
data0 <- data.frame(record.id=1:n.record,sample.id=sample(samples,n.record,replace=TRUE),test.id=sample(tests,n.record,replace=TRUE),time=Sys.Date()+sample(0:1000,n.record,replace=TRUE),value=rnorm(n.record,500,10))

もっとスマートに書けそうな気がするが、

subset

で目的のサンプルIDとテストIDが出るまで粘って、

tapply

を使ってみよう。

head(data0)
  record.id sample.id test.id       time    value
1         1        s1      t3 2013-09-23 500.1883
2         2        s3      t1 2013-05-03 502.4603
3         3       s10      t2 2014-12-13 512.0590
4         4        s2      t1 2014-06-07 518.8334
5         5        s9      t2 2013-04-03 511.1780
6         6        s1      t1 2014-05-09 497.0600
data1 <- subset(subset(data0, sample.id == "s1"), test.id == "t1")
tapply(data1$value, data1$time, mean)
2013-02-15 2013-03-17 2013-03-18 2013-04-15 2013-05-01 2013-05-31 2013-06-11 
  492.3391   495.5637   505.7816   497.4088   483.2015   485.7651   506.3763 
2013-07-15 2013-09-01 2013-10-14 2013-11-08 2013-11-22 2013-12-13 2013-12-21 
  506.3834   492.4210   495.7848   509.3172   512.8030   492.6678   491.0282 
2013-12-29 2014-01-16 2014-03-05 2014-04-04 2014-04-26 2014-05-09 2014-06-17 
  495.4939   503.3959   498.3088   496.9071   507.5645   497.0600   508.8446 
2014-06-29 2014-07-28 2014-08-08 2014-08-24 2014-09-04 2014-09-06 2014-09-08 
  482.7414   509.0887   492.0244   506.0334   498.7821   492.1356   524.0940 
2014-10-23 2015-03-21 2015-03-28 2015-04-12 2015-06-28 2015-09-10 2015-09-27 
  502.9567   494.9309   498.3350   486.0904   485.7138   498.9441   500.0359 
2015-10-06 
  507.8609