在数据库中汇集项目,直到达到最小样本大小,并在R中找到所有排列

在数据库中汇集项目,直到达到最小样本大小,并在R中找到所有排列,r,permutation,R,Permutation,这是一个例子 df <- data.frame(item=letters[1:5], n=c(3,2,2,1,1)) df item n 1 a 3 2 b 2 3 c 2 4 d 1 5 e 1 如何获得所有可能的独特解决方案 此外,代码也不允许任何集群的样本大小小于4。下面,我们使用包分区采用暴力方法。我们的想法是找到df行的每个分区。然后,我们对每组进行汇总,检查是否满足要求 df <- data.frame(item=letters[1:5

这是一个例子

df <- data.frame(item=letters[1:5], n=c(3,2,2,1,1))
df
  item n
1    a 3
2    b 2
3    c 2
4    d 1
5    e 1
如何获得所有可能的独特解决方案


此外,代码也不允许任何集群的样本大小小于4。

下面,我们使用包
分区
采用暴力方法。我们的想法是找到
df
行的每个分区。然后,我们对每组进行汇总,检查是否满足要求

df <- data.frame(item=letters[1:5], n=c(3,2,2,1,1))

minSize <- 4

funGetClusters <- function(df, minSize) {
    allParts <- partitions::listParts(nrow(df))

    goodInd <- which(sapply(allParts, function(p) {
        all(sapply(p, function(x) sum(df$n[x])) >= minSize)
    }))

    allParts[goodInd]
}

clusterBreakdown <- funGetClusters(df, minSize)

allDfs <- lapply(clusterBreakdown, function(p) {
    copyDf <- df
    copyDf$cluster <- 1L
    clustInd <- 2L

    for (i in p[-1]) {
        copyDf$cluster[i] <- clustInd
    }

    copyDf
})
应该注意的是,随着行数的增加,会出现组合爆炸。例如,仅使用10行,我们就必须测试不同的分区

正如@chinsoon评论的那样,
RcppAlgos
可能是一个很好的选择,可以为更大的情况提供一个可接受的解决方案。免责声明,我是作者。我以更大的投入回答了类似的问题,并取得了良好的成功

    • @AllanCameron也有一个很好的答案和很好的方法来解决这个问题。你也应该读一读
最后,Robin K.S.Hankin(分区包的作者)和Luke J.West的以下小插曲不仅是一本很好的读物,而且非常适用于像这里介绍的问题


您可能想查看
RcppAlgos
软件包。您的实际数据集中有多少个唯一项?
df <- data.frame(item=letters[1:5], n=c(3,2,2,1,1))

minSize <- 4

funGetClusters <- function(df, minSize) {
    allParts <- partitions::listParts(nrow(df))

    goodInd <- which(sapply(allParts, function(p) {
        all(sapply(p, function(x) sum(df$n[x])) >= minSize)
    }))

    allParts[goodInd]
}

clusterBreakdown <- funGetClusters(df, minSize)

allDfs <- lapply(clusterBreakdown, function(p) {
    copyDf <- df
    copyDf$cluster <- 1L
    clustInd <- 2L

    for (i in p[-1]) {
        copyDf$cluster[i] <- clustInd
    }

    copyDf
})
allDfs
[[1]]
  item n cluster
1    a 3       1
2    b 2       1
3    c 2       1
4    d 1       1
5    e 1       1

[[2]]
  item n cluster
1    a 3       1
2    b 2       2
3    c 2       2
4    d 1       1
5    e 1       1

[[3]]
  item n cluster
1    a 3       2
2    b 2       1
3    c 2       1
4    d 1       2
5    e 1       1

[[4]]
  item n cluster
1    a 3       2
2    b 2       1
3    c 2       1
4    d 1       1
5    e 1       2

[[5]]
  item n cluster
1    a 3       2
2    b 2       1
3    c 2       2
4    d 1       1
5    e 1       1

[[6]]
  item n cluster
1    a 3       2
2    b 2       2
3    c 2       1
4    d 1       1
5    e 1       1