2012-04-25 57 views
-1

我有大载体与以下类型:加成连续数间隔ř

myvec <- c(1,2,3,5, 0,1,2,5,8, 0,1,3, 0,2,3,8, 0,3,5) 

为基的相应的矢量为:

grp <- c(rep(1, 4), rep(2, 5), rep(3,3), rep(4, 4), rep(5, 3)) 

我需要添加数量的这种方式连续组的最后一个数字将被添加到第二组中的距离加上2(以创建间隙)。然后第二组的最后一个数字将被添加到第三脓液3以创建一个间隙。

从而新的向量将看起来像

 myvecnew <- c(1, 2, 3 ,5, # maximum 5 + 2 applied in group 2 

    5+0+2 = 7, 5+1+2 = 8, 5+2+2 = 9, 5+5+2 = 12, 8+5+2 = 15, # maximum 15 + 2 applied in group 3 

     0+15+2 = 17, 1+15+2 = 18, 3+15+2 = 20, # maximum 20 + 2 applied to group 4 

        0 + 20 + 2 = 22,..........and so on) 

因此MAX(值)组1的加2被添加到每2个值,第2组所得到的新的最大将被添加到组3加上常数2,我需要继续前进,直到所有组都被覆盖。 这是如何实现的? ........

+1

第二组不应该有长度5?即grp <-c(rep(1,4),rep(2,5),rep(3,3),rep(4,4),rep(5,3))。 – 2012-04-25 23:36:53

+1

我想这个问题的另一个错误是,当你到达myvecnew时,组2的最大值(8 + 5 + 2 = 15)被添加到组3中,但我没有看到额外的'加上常数2'被添加。 @JohnCLK,请检查这一点。 – 2012-04-25 23:39:32

+0

@JohnColby谢谢你的纠正......我纠正了他们......谢谢你理解我的意思 – jon 2012-04-26 00:50:36

回答

2

通过什么我觉得阅读是问题(见注释),我相信你能实现你想要喜欢什么2个错误:

grps = lapply(unique(grp), function(x) myvec[grp==x]) 
to.add = cumsum(sapply(grps, max) + 2) 

> c(grps[[1]], unlist(lapply(2:length(grps), function(x) grps[[x]] + to.add[x-1]))) 
[1] 1 2 3 5 7 8 9 12 15 17 18 20 22 24 25 30 32 35 37 

(如你可以看到,我也喜欢与列表一起工作)

+0

是的,你是对的......我纠正了错误,谢谢...... – jon 2012-04-26 01:05:10

1
for(i in unique(grp)[-1]) 
{ 
    myvec[which(grp==i)]= 
      2 + 
      myvec[which(grp==i)]+ 
      max(myvec[which(grp==(i-1))]) 
} 
+0

这给了我'1 2 3 5 6 7 8 11 14 16 17 19 22 24 25 30 34 37 39' ,在问题中与'myvecnew'不匹配:'1 2 3 5 7 8 9 12 ...' – 2012-04-25 23:41:14

+0

我纠正了它。 – Seth 2012-04-26 02:27:50