2017-01-31 4 views
0

私は集計プロセスを設計しようとしています。私は 'expand.grid'(すなわち、過剰なベクトルの長さ)によって引き起こされる問題を回避しようとします。シーケンシャル集計モデル - data.frame

私はデータフレームDATAを設計しました。最初は、P1とV1、V2とP2にプロセスを共同で適用する必要があります。一旦実行されると、P1、P2、V1、V2を除去し、プロセス出力(2つのベクトル:P12とV12)をデータフレームDATAに加え、プロセスをベクトルV12とP12とV3とP3に再び再適用する必要があります。したがって、V3とP3が削除されるまで、V123とP123が追加され、V123とP123、V4とP4にプロセスが再適用されました。データフレームはNAまたは0で埋められます。

私は通常、n個のベクトル(Pi)とn個のベクトル(Vi)で作業することに注意することが重要です。

DATAFRAME DATA:

P1 P2 P3 P4   V1  V2   V3 V4 
    1 0 0 0 0 0.34505340 0.9498 0.958886346 0.88 
    2 1 1 1 1 0.11640585 0.0338 0.012040961 0.04 
    3 2 2 2 2 0.09746205 0.0164 0.009259039 0.08 
    4 3 0 3 0 0.11484475 0.0000 0.019813654 0.00 
    5 4 0 0 0 0.32623395 0.0000 0.000000000 0.00 

出力例:

 P12  V12  
1  0 0.1851 
2  1 0.1419 
3  2 0.1794 
4  3 0.1395 
5  4 0.3659 
6  5 -0.0045 
7  6 -0.0141 

敬具、 majesus

+0

は、あなたが出力サンプルデータセットを表示することができますか?私はあなたの操作後にP12またはV12に何が起こるのか理解しようとしています。 –

答えて

1

あなたはインクリメンタル列を変異させるdplyrで次の操作を行うことができます。私は、ターゲットのvarnamesと数式を文字列に格納します。これは、その方法を説明するための単純な例です。私はあなたの計算がもう少し複雑だと考えています。

df <- data.frame(p1 = 0:4 
       ,p2 = c(0,1,2,0,0) 
       ,p3 = c(0:3,0) 
       ,p4 = c(0,1,2,0,0) 
       ,v1 = rnorm(5) 
       ,v2 = rnorm(5) 
       ,v3 = rnorm(5) 
       ,v5 = rnorm(5)) 

library(dplyr) 
var <- sapply(2:4,function(x) paste0('p',paste0(1:x, collapse=""))) 

form <- sapply(2:4,function(x) paste0("p",paste0(1:(x-1),collapse = ""),"*","p",x)) 

df %>% mutate_(.dots=setNames(form, var)) 

文字列ベクトル:

> var 
[1] "p12" "p123" "p1234" 
> form 
[1] "p1*p2" "p12*p3" "p123*p4" 

結果:

p1 p2 p3 p4   v1   v2   v3   v5 p12 p123 p1234 
0 0 0 0 0.6901867 0.6365963 0.3526106 -0.8348200 0 0  0 
1 1 1 1 0.1530939 0.8553939 1.2160768 3.1494818 1 1  1 
2 2 2 2 1.2732477 -0.3102100 1.2538673 0.8904290 4 8 16 
3 0 3 0 0.9067448 0.7085275 -1.0328784 0.1979246 0 0  0 
4 0 0 0 -0.1388101 0.1275527 1.6018554 0.4335777 0 0  0 
+0

ご回答いただきありがとうございます。私の仕事は、Piだけでなく、変数PiとViにプロセスを共同で適用することです。また、「機能」モードでプロセスをプログラムすることは容易ではありません。 'while'または 'for-loop'を使用できますか? – majesus

+0

答えは単なるイラストです。実際にはループです。 'mutate_'コマンドはベクトル' form'のすべての計算を順次評価しています。したがって、このベクトルにv12 v123とv1234の計算もあることを確認する必要があります。 – Wietze314

+0

これは素晴らしいことです!どうもありがとうございました。 – majesus