在数据库中汇集项目,直到达到最小样本大小,并在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也有一个很好的答案和很好的方法来解决这个问题。你也应该读一读
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