我试图设计一个聚合过程。我尽量避免由> 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
答案 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