如何检测 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))]
数据
我正在与 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
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))]