【问题标题】:all possible combinations of a list of vectors向量列表的所有可能组合
【发布时间】:2018-01-18 11:33:53
【问题描述】:

我有一个向量列表,我想获取每个向量的元素之间所有可能组合的列表,即一次包含两个和两个以上的 n 个元素的组合(来自一个向量)。

例如,我有以下列表:

> DF
$`1`
   A B   C
1 11 2 432

$`2`
   A B   C
2 11 3 432

$`3`
   A B   C
3 13 4 241

这是我的代码:

> d=list()
>   for (j in 1:length(DF)){
+     for (i in 2:length(DF)){
+       d[[j]]=combn(DF[[j]],i,simplify=F)
+     }
+   }
> d
[[1]]
[[1]][[1]]
   A B   C
1 11 2 432

[[2]]
[[2]][[1]]
   A B   C
2 11 3 432

[[3]]
[[3]][[1]]
   A B   C
3 13 4 241

这是错误的,因为我一次只得到三个元素的组合。我将不得不添加三个元素的组合,一次取两个。我只是得到最后一个循环值。这是循环内部的维度问题。

如果我只为 i=2 运行循环,那么我得到:

> d
[[1]]
[[1]][[1]]
   A B
1 11 2

[[1]][[2]]
   A   C
1 11 432

[[1]][[3]]
  B   C
1 2 432


[[2]]
[[2]][[1]]
   A B
2 11 3

[[2]][[2]]
   A   C
2 11 432

[[2]][[3]]
  B   C
2 3 432

....

【问题讨论】:

  • 你在找combn(DF, 2, FUN = list)
  • 感谢 akrun,但组合是在每个向量的元素之间。我要修改问题。
  • @akrun 也许是lapply(DF, combn, m = 2, simplify = F)
  • @jazzurro 可能是,让 OP 更新为预期的输出
  • 感谢 jazzurro,但在这种情况下 ncol(DF)=3,所以它是 m=2 和 m=3。如果 ncol 为 5,则为 m=2,3,4,5

标签: r


【解决方案1】:

你可以试试

lapply(2:3, function(k) { lapply(1:length(DF),function(x){ combn(DF[[x]],k, 
                          simplify = FALSE)})})

【讨论】:

  • 谢谢丹,它运作良好。我在上一条评论中尝试了这种方式,但也许您的解决方案更快。如何在您的解决方案中获取行向量而不是列向量
  • 您的意思是输出显示名称“A”、“B”、“C”吗?在这种情况下,将:simplify = FALSE 添加到 combn 函数中
  • 我已将simplify 参数添加到代码块中,现在运行它应该会为您提供名称
  • 非常感谢,这正是我想要的。谢谢大家,很棒的社区。​​span>
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多