数据
我正在使用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,这意味着另一个组从这里开始直到另一个组。
答案 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
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))]