使用条件

时间:2017-03-02 15:48:49

标签: r data.table

我在data.table列上有一组非负整数值,我需要减去一个值(n)。

如果n的值是例如34,那么从data.table列中的所有值中减去的总数将需要是34(即,不从每个值中减去34)。

但是有一些限制因素。如果存在0值,那么该值必须保持为0,如果任何值大于0,则它不能完成低于1.最后,我希望减法是随机的,所以(如果数学上可能)我得不到每次都有相同的结果。

以下是一些示例数据:

library(data.table)
n = 34
dt1 <- data.table(SIZE = c(12,0,28,3,42,57)) 

这两个输出示例基于样本数据,符合我的标准:

s1 <- data.table(SIZE = c(1,0,18,1,40,48))
s2 <- data.table(SIZE = c(2,0,24,3,42,37)) 

1 个答案:

答案 0 :(得分:1)

这是drawing from an urn,无需替换。与每行相关的“球”数量为

dt1[, pmax(SIZE-1L, 0)]
# [1] 11  0 27  2 41 56

如果球数少于n,则问题不可行。否则,您可以使用sample

set.seed(1)
dt1[, sample(rep(.I, pmax(SIZE-1L, 0)), n)]
# [1] 3 5 5 6 3 6 6 6 6 1 6 3 6 5 6 5 6 6 5 6 6 3 5 3 3 5 1 5 6 6 5 5 6 3

申请此抽奖......

set.seed(1)
draw <- dt1[, .( r = sample(rep(.I, pmax(SIZE-1L, 0)), n))][, .N, by=r]
dt1[, NEW_SIZE := SIZE ][ draw$r, NEW_SIZE := SIZE - draw$N ]
#    SIZE NEW_SIZE
# 1:   12       10
# 2:    0        0
# 3:   28       21
# 4:    3        3
# 5:   42       32
# 6:   57       42

# verify 
dt1[, sum(SIZE  - NEW_SIZE)] == n
# [1] TRUE