2017-01-31 68 views
0

我正在嘗試設計一個聚合過程。我儘量避免由'expand.grid'引起的問題(即矢量長度過長)。順序聚集模型 - data.frame

我設計了一個dataframe數據。最初我必須聯合應用一個過程到P1和V1以及V2和P2。一旦執行,必須刪除P1,P2,V1和V2,並將過程輸出(兩個矢量:P12和V12)添加到數據幀DATA中,並再次將該過程重新應用於矢量V12和P12以及V3和P3。因此,直到V3和P3被移除後,V123和P123才被添加,並重新應用到V123和P123以及V4和P4。數據幀填充了NA或0.

重要的是要注意我通常使用n個向量(Pi)和n個向量(Vi)。

數據幀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和Vi的過程,而不僅僅是Pi。另外,我在「功能」模式下編程過程並不容易。我可以使用'while'還是'for-loop'? – majesus

+0

答案只是一個例子。實際上它是一個循環。 'mutate_'命令按順序評估向量'form'中的每個計算。因此,您需要確保在此矢量中還有一個針對v12 v123和v1234的計算。 – Wietze314

+0

這太棒了!非常感謝你。 – majesus