使用rollapply从矢量条件提取

时间:2017-10-11 08:26:50

标签: r cumsum rollapply

我试图在满足特定条件的向量中提取一系列值。为了说明这一点,我有以下向量:

UPDATE tableB 
SET sum_productA = (SELECT Price * Frequency_ProductA FROM tableA WHERE Product = 'ProductA'),
SET sum_productB = (SELECT Price * Frequency_ProductB FROM tableA WHERE Product = 'ProductB');

我想隔离总和小于10的连续值,以便输出如下所示:

 frame = (0 0; 768 1024)

通过使用zoo :: rollsum()和逻辑测试

,我可以非常低效地解决这个问题
a <- c(1,2,1,3,12,3,2,15,1,1,1,1,4,5,20)

但为了做到这一点,我必须多次运行它,每次都增加滚动窗口。我可以在循环中做到这一点,但显然不是最佳方式。

有人能想到这个解决方案吗?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我会使用自己的循环。结果与Maurits&#39;:

相同
a <- c(1,2,1,3,12,3,2,15,1,1,1,1,4,5,20)

my.roll <- function(x, limit) {
  res <- vector("list", length(x))
  ctr <- 1
  for (i in seq_along(x)) {
    res[[ctr]] <- c(res[[ctr]], x[i])
    if (sum(res[[ctr]], x[i+1], na.rm = TRUE) > limit) {ctr = ctr+1} else {ctr}
  }
  res <- res[!sapply(res, is.null) & sapply(res, function(x) sum(x) <= limit)]
  return(res)
}
my.roll(a, 10)

答案 1 :(得分:0)

以下使用累计金额%/%的内容如下:

idx <- as.numeric(factor(cumsum(a) %/% 10))
ret <- split(a, idx)
ret <- ret[sapply(ret, function(x) all(x < 10))]

ret;
#$`1`
#[1] 1 2 1 3
#
#$`3`
#[1] 3 2
#
#$`5`
#[1] 1 1 1 1 4
#
#$`6`
#[1] 5

说明:as.numeric(factor(...))返回split的索引;在最后一步中,我删除了条目>=10

请注意,这假设OP的示例中存在错误,其中数字4似乎重复。如果OP的例子确实是正确的,那么我就不能理解这个问题。