我用$ M $的基数设置了$ S $。我想创建最大基数为$ K $的$ S $的所有幂集,其中$ K \ le M $。 我使用$ R $来创建功率集,但是它没有提供将其约束到上述情况的选项。由于$ S $的大小确实很大(500),对于我的问题,我只需要计算基数最多为5的所有子集。 有人可以帮我在R中做到这一点吗?
答案 0 :(得分:0)
带有| S | = 500 k不会很大。对于k = 0、1、2、3、4、5,这是有多少个子集的大小最大为k:
cumsum(sapply(0:5, choose, n = 500))
## [1] 1 501 125251 20833751 2593864876 257838552476
现在转到代码注释处,combn(x = S, m = i, simplify = FALSE)
给出大小为i
的所有子集,因此:
# test data
S <- head(letters, 4)
k <- 2
subsets_k <- do.call("c", lapply(0:k, combn, x = S, simplify = FALSE))
给出0、1或k = 2个元素的所有子集:
> subsets_k
[[1]]
character(0)
[[2]]
[1] "a"
[[3]]
[1] "b"
[[4]]
[1] "c"
[[5]]
[1] "d"
[[6]]
[1] "a" "b"
[[7]]
[1] "a" "c"
[[8]]
[1] "a" "d"
[[9]]
[1] "b" "c"
[[10]]
[1] "b" "d"
[[11]]
[1] "c" "d"
或者我们可以将它们表示为以逗号分隔的元素的字符向量:
sapply(subsets_k, toString)
## [1] "" "a" "b" "c" "d" "a, b" "a, c" "a, d" "b, c" "b, d" "c, d"
或直接:
unlist(sapply(0:k, function(i) combn(S, i, FUN = toString)))
## [1] "" "a" "b" "c" "d" "a, b" "a, c" "a, d" "b, c" "b, d" "c, d"