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
サンプルのそれぞれの検査の最新データの平均値が欲しいとする。
# レコード数の指定 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