顺序聚合模型 - data.frame

时间:2017-01-31 09:29:53

标签: r combinations

我试图设计一个聚合过程。我尽量避免由> expand.grid'引起的问题。 (即矢量长度过长)。

我设计了一个数据帧DATA。最初我必须联合应用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)。

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

1 个答案:

答案 0 :(得分: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