【问题标题】:R Get all subsets where rowsum fulfills conditionR获取rowsum满足条件的所有子集
【发布时间】:2021-06-09 20:55:53
【问题描述】:

例如,我在 R 中有一个 data.table:

x <- data.table( id = c(1:10), count=c(10,110,20,30,5,40,50,15,20,70))

我想分别选择 id 的所有子集组合,其中 count 的行和在 90 到 110 之间。 一种组合是 105

id IN (1,3,4,5,6) 

因为计数的总和是

x[id %in% c(1,3,4,5,6), sum(count)]

如何获得所有可能的组合?

【问题讨论】:

  • 真正问题的规模有多大?蛮力方法可能适用于此,但不太可能适用于大数据。在您上面提出的问题中,有 1023 种可能的组合,但对于 20 个 ID 值,则超过一百万。
  • 真正的问题是大约 1500 个 id。
  • 您可能在这里问过一个比面向数据更数学的问题。我的建议是查看 CRAN 上的 'rfast' 库。也许这个功能:“行 - 明智的矩阵/向量计算一个值的频率”。可能有一个经过充分手工制作的优化 data.table 解决方案,但通常此类问题与一些众所周知的复杂数学运算有关,这些运算通常是特定库解决的。

标签: r data.table subset rowsum


【解决方案1】:

这是您当前数据集的强力解决方案

p <- crossprod(
  x$count,
  sapply(
    seq(2^nrow(x)),
    function(n) head(as.integer(intToBits(n)), nrow(x))
  )
)

res <- lapply(
  which(p >= 90 & p <= 110, arr.ind = TRUE)[, "col"],
  function(i) x$id[which(head(intToBits(i), nrow(x)) > 0, arr.ind = TRUE)]
)

你会看到

> head(res)
[[1]]
[1] 2

[[2]]
[1] 3 4 6

[[3]]
[1] 1 3 4 6

[[4]]
[1] 3 4 5 6

[[5]]
[1] 1 3 4 5 6

[[6]]
[1] 1 4 7

但是,它不能针对具有更多 id 的大型数据集进行扩展。

【讨论】:

    猜你喜欢
    • 2023-01-25
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多