我试图在满足特定条件的向量中提取一系列值。为了说明这一点,我有以下向量:
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)
但为了做到这一点,我必须多次运行它,每次都增加滚动窗口。我可以在循环中做到这一点,但显然不是最佳方式。
有人能想到这个解决方案吗?任何帮助将不胜感激!
答案 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的例子确实是正确的,那么我就不能理解这个问题。