r - 列出给定大小的向量的所有子集

标签 r list subset enumerate

函数choose(n,k)告诉我们对于一组n个不同元素存在多少个大小为k的子集。假设我需要实际列出这些子集,我如何创建它?换句话说,我正在寻找一个接受向量x(长度n)和数字k并返回列表的函数向量,每个大小为 k,带有 x 的子集。当然,列表的长度应该是choose(length(x),k)。例如

enum.choose = function(x,k) {
    # implementation should go here
{

enum.choose(1:3,2)

# should be:
# [[1]]
#    1  2
# [[2]]
#    1  3
# [[3]]
#    2  3

最佳答案

编辑

<小时/>

我意识到 combn(1:3, 2, simple = FALSE) 可以为您提供所需的列表结果。如果@Ramnath 希望发布答案,该答案将被删除。

> combn(1:3, 2, simplify = FALSE)
## [[1]]
## [1] 1 2

## [[2]]
## [1] 1 3

## [[3]]
## [1] 2 3

因此在其上使用 *apply 函数将使以下函数变得无关紧要。

<小时/>

原创

<小时/>

利用@Ramnath 的评论,你的函数可能是这样的:

enum.choose <- function(x, k) {
  if(k > length(x)) stop('k > length(x)')
  if(choose(length(x), k)==1){
    list(as.vector(combn(x, k)))
  } else {
    cbn <- combn(x, k)
    lapply(seq(ncol(cbn)), function(i) cbn[,i])
  }
}

测试运行:

> enum.choose(1:3, 2)
# [[1]]
# [1] 1 2
# 
# [[2]]
# [1] 1 3
# 
# [[3]]
# [1] 2 3
> enum.choose(c(1, 2, 5, 4), 3)
# [[1]]
# [1] 1 2 5
# 
# [[2]]
# [1] 1 2 4
# 
# [[3]]
# [1] 1 5 4
# 
# [[4]]
# [1] 2 5 4
> enum.choose(1:4, 4)
# [[1]]
# [1] 1 2 3 4
> enum.choose(1:5, 6)
# Error in enum.choose(1:5, 6) : k > length(x)

关于r - 列出给定大小的向量的所有子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585925/

相关文章:

javascript - 调试可能的总数 - JavaScript

r - 如何设置传单 map 的缩放级别/ View

list - 使用 JSTL 迭代 List 和 Map 的元素 <c :forEach> tag

r - 从 Factoextra 更改 fviz 函数中的图例属性

list - 按属性值对 Flutter (Dart) 中的对象列表进行排序

Python 在 n 处切片列表并获取接下来的 x 个元素?

r - (R) []/subset() 返回空数据框

R:通过字符串匹配提取数据帧的列

r - 如何替换 ggmap 对象中的颜色?

r - 在 tibble 中填写 NA 值,而不将其转换为 data.frame