2011-07-09 22 views
3

私は時系列の複数のデータフィールドを持つインポートしたCSVを持っています。したがって、最初のフィールドはdatetimeで、残りのフィールドはさまざまなデータポイントです。複数のシリーズのポイントワイズをプロットする

複数のフィールドのポイントワイズ最大値をプロットすると、フィールドはワイルドカードの一種にマッチしますか?

time,foo1,foo2,foo3 
1:00,1,2,3 
2:00,3,1,1 
3:00,2,5,3 

プロットする最も簡単な方法は何だろうfoo.*、このような私は、各フィールドの最大を得ること:すなわち、例えばので

その例から得られるプロットは、(1:00,3)、(2:00,3)、(3:00,5)?

例を明確にするために、私が意味する、最大のポイントは、**

time,foo1,foo2,foo3 
1:00,1,2,*3* 
2:00,*3*,1,1 
3:00,2,*5*,3 

答えて

6

は、あなたのデータはdata.frame xであると仮定している、あなたはそうのようなpmaxを使用することができます。

cbind(x[,"time"], do.call(pmax, x[,grepl("^foo*",names(x))])) 

do.callxの各列が...引数(負のサブスクリプトで削除された最初の列を除く)として、pmax関数を呼び出します。 cbindは、do.callから得られたベクターとxの第1の列を組み合わせる。

do.callの2番目の引数はリストである必要があり、data.frameはいくつかの余分な属性を持つリストであることに注意してください。 xがdata.frameでない場合は、それを1つ(または通常のリスト)に強制する必要があります。

+0

私の質問の他の部分については、とにかくデータフレームの列を列名に基づいてフィルタリングすることに気づいていますか? –

+0

@Kyle - 'grepl'を使って' names'でアクセスできる列名の論理ベクトルを返すことができます。この 'dat [、grepl("(foo | bar) "、names(dat))]'のようなものは、data.frame 'dat'の' foo'と 'bar'カラムを返します。 Rは正規表現のマジックをかなり堅牢にサポートしているので、カラム名に基づいて行う必要のあるフィルタリングが実現できると思います。 – Chase

+0

@Kyle:申し訳ありませんが、私はその部分を逃しました。 @Chaseはオンになっています。私は列の選択を含めるために私の答えを編集しました。 –

2

これは@ジョシュアのすばらしい答えと比べるとほとんど恥ずかしいですが、私はおそらくreshape2plyrを使ってこれに接近していたでしょうが、他の答えで啓発されていませんでした。 meltは、データを「ロング」形式に変換し、次にddplyグループを時間列でグループ化し、最大値を選択します。

library(plyr) 
library(reshape2) 


dat <- data.frame(time = 1:3, foo1 = c(1,3,2), foo2 = c(2,1,5), foo3 = c(3,1,3)) 
dat.m <- melt(dat, id.vars = "time") 
ddply(dat.m, "time", summarize, max = max(value)) 
    time max 
1 1 3 
2 2 3 
3 3 5 

テストでは、Joshuaの回答が〜30倍高速であることが確認されています。私の解決策の唯一のもっともらしい利点は、理解しやすいかもしれないということですが、それは非常に主観的です。結果:

library(rbenchmark) 
f_svelte <- function(dat){ 
    cbind(dat[,1], do.call(pmax, dat[,-1])) 

} 

f_fat <- function(dat) { 
    dat.m <- melt(dat, id.vars = "time") 
    ddply(dat.m, "time", summarize, max = max(value)) 
} 

benchmark(f_svelte(dat), f_fat(dat) 
      , columns = c("test", "elapsed", "relative") 
      , order = "relative" 
      , replications = 500 
     ) 

      test elapsed relative 
1 f_svelte(dat) 0.11 1.00000 
2 f_fat(dat) 3.59 32.63636 
関連する問題