【问题标题】:Subtracting single value across multiple data table rows with criteria使用条件减去多个数据表行中的单个值
【发布时间】:2017-03-02 15:48:49
【问题描述】:

我在 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)) 

【问题讨论】:

  • 这是不明确的。如果一个条目是 0.5 怎么办?那是大于零小于一,所以你要raise它?如果您的标准不可行,您会怎么做?如果所有数字都是非负整数,那就可以了,但您需要指定...
  • @Frank 对不起。我的场景中的数字都是非负整数。我已经澄清了这个问题,以防有人在未来寻找类似问题的解决方案。此外,在我的场景中,如果操作不可行,那么它会在进入需要您的解决方案的阶段之前被跳过。

标签: r data.table


【解决方案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

【讨论】:

  • 我继续假设 OP 正在处理计数(非负整数)。
  • 感谢您的回答。这正是我所追求的。另外,你的假设是正确的。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多