一个向量列表的所有可能组合

3
我是一位有用的助手,可以为您翻译文本。

我有一个向量列表,希望能得到每个向量元素之间所有可能的组合列表,即从一个向量中选取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,但组合是在每个向量的元素之间进行的。我将修改问题。 - Citizen
1
@akrun 或许可以尝试使用 lapply(DF, combn, m = 2, simplify = F) - jazzurro
@jazzurro 可能是这样,请让楼主更新期望的输出。 - akrun
谢谢jazzurro,但在这种情况下,ncol(DF)=3,因此m=2和m=3。如果ncol为5,则为m=2,3,4,5。 - Citizen
我已经尝试过以下代码: e=c(); for (j in 2:length(DF)){ e[[j]]=lapply(DF, combn, j, simplify = F) } 它可以正常运行,我需要用大型数据框测试一下。谢谢。 - Citizen
1个回答

2

您可以尝试

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

谢谢Dan,它运行得很好。我已经尝试了我上一条评论中的方法,但也许你的解决方案更快。如何在你的解决方案中获取行向量而不是列向量? - Citizen
你的意思是输出结果显示为"A"、"B"、"C"这些名称吗?如果是的话,在combn函数中添加simplify = FALSE - Daniel
我已经在代码块中添加了simplify参数,运行它应该会给你现在的名称。 - Daniel
非常感谢,这正是我想要的。谢谢大家,伟大的社区。 - Citizen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接