如何检测表格列中的值并将其减去另一列?

时间:2018-02-19 09:20:33

标签: r dataframe data.table quantile

数据

我正在使用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中相应行的总和,然后如果结果低于总和的20%分位数。在V2中对应的行,然后V2中的对应行得到0,否则,将结果拆分为V2中的相应行。

示例

在V3中,我们有2个第一行&gt; 0。我们总结一下 - &gt;在图2中,对应行的总和为3.我们减去它,我们得到1对于20%分位数&gt; =因此我们将它分开并且对于下面的相同。结果可能是:

   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,这意味着另一个组从这里开始直到另一个组。

1 个答案:

答案 0 :(得分:1)

假设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))]