如何检测 table 列中的值并将它们减去另一列?

How to detect values in table's column and subtract them to another column?

数据

我正在与 data.table 合作,我正在尝试进行相当困难的操作。 我的数据是这样的

A <- data.table(c("a","a","b","c","d","d"),c(1,2,2,3,4,9),c(1,1,0,0,7,3))
   V1 V2 V3
1:  a  1  1
2:  a  2  1
3:  b  2  0
4:  c  3  0
5:  d  4  7
6:  d  9  3

我想做什么

我需要检测 V3 中何时存在 >0 的值。在这种情况下,我需要将 V3 中连续 > 0 的值相加,然后将它们减去 V2 中相应行的总和,然后如果结果低于 V2 中相应行总和的 20% 分位数,然后 V2 中的相应行得到 0,否则,将结果拆分到 V2 中的相应行中。

例子

在 V3 中,我们有 2 个第一行 >0。我们对它求和 -> 2,相应行的总和为 3。我们减去它,我们得到 1 >= 到 20% 分位数,所以我们拆分它,下面相同。结果可能是:

   V1  V2 V3
1:  a 0.5  1
2:  a 0.5  1
3:  b 2.0  0
4:  c 3.0  0
5:  d 1.5  7
6:  d 1.5  3

编辑

当有一个0时,这组值就结束了。我的意思是,第一组是前两行,包含 V3 中的 1 和 1,然后是 0,因此该组结束。然后还有一个0所以我们不取然后,有一个值>0这意味着另一个组从这里开始直到另一个0.

假设 V1 也反映了 V3 > 0 的位置,您可以在分组依据中使用 V1。

A[V3 > 0, V2 := ifelse( (sum(V2) - sum(V3)) < 0.2*sum(V2), 0, (sum(V2) - sum(V3)) / .N),
    by=.(V1)]

或者,如果不能依赖 V1,您可以使用 rle

即时创建类似 V1 的分组,如下所示
A[, 
    V2 := ifelse(V3 <= 0, V2,
        ifelse(sum(V2) - sum(V3) < 0.2*sum(V2), 0, (sum(V2) - sum(V3)) / .N)),
    by=.(rep(seq_along(rle(V3 > 0)$values), rle(V3 > 0)$lengths))]