R 条件累积和

R 条件累积和,r,R,我有这个数据框 t<-data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1)) 有什么想法吗?这里有一种方法: t <- data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1)) unname(with(t, tapply(v1[v2>0], cumsum(abs(di

我有这个数据框

t<-data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1))
有什么想法吗?

这里有一种方法:

t <- data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1))

unname(with(t, tapply(v1[v2>0], cumsum(abs(diff(sign(c(0,v2)))))[v2>0], sum)))
[1]  8 10 12  2
t0],总和(abs(diff(sign(c(0,v2щщ))[v2>0],总和)))
[1]  8 10 12  2
一开始可能有点复杂:)
cumsum(abs(diff(sign)(c(0,v2 kЮЮ))
为每次运行正值或负值生成一个唯一的组id。使用
diff
cumsum
进行此操作是一个“常见”技巧,值得了解。。。一个障碍是
diff
产生一个较短的向量-这就是为什么使用
c(0,v2)

我更改了data.frame的名称,因为t是一个函数(转置)。我不明白,如果你只想要总和,为什么要用cumsum

dtf<-data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1))
groups  <- rle(dtf$v2 > 0)

dtf$groups<- rep(seq_along(groups$values), groups$lengths)
library(plyr)
daply(dtf, .(groups), function(x) sum(x$v1))[groups$values]
 1  3  5  7 
 8 10 12  2 
dtf还有另一种方法

> r <- rle(sign(t$v2))
> diff(c(0,cumsum(t$v1)[cumsum(r$lengths)]))[r$values==1]
[1]  8 10 12  2

如果你只想要求和,为什么要使用cumsum?@Iselzer-是的,它似乎更像是一个“条件求和”。。。
> r <- rle(sign(t$v2))
> diff(c(0,cumsum(t$v1)[cumsum(r$lengths)]))[r$values==1]
[1]  8 10 12  2
> (s <- cumsum(t$v1))
 [1]  1  3  4  8 14 21 29 31 34 38 46 47 49
> (r <- rle(sign(t$v2)))
Run Length Encoding
  lengths: int [1:7] 4 2 2 1 2 1 1
  values : num [1:7] 1 -1 1 -1 1 -1 1
> (k <- cumsum(r$lengths))
[1]  4  6  8  9 11 12 13
> (a <- c(0,s[k]))
[    1]  0  8 21 31 34 46 47 49
> (d <- diff(a))
[1]  8 13 10  3 12  1  2
> d[r$values==1]
[1]  8 10 12  2
> k <- which(diff(c(sign(t$v2),0))!=0)
> diff(c(0,cumsum(t$v1)[k]))[t$v2[k]>0]
[1]  8 10 12  2