在R中,我如何获得列表中每个元素的组合然后将它们连接起来?

时间:2016-07-05 04:54:47

标签: r

我有一个列表,我正在尝试从中选择一个特定的数字。例如:

x <- list()
x[[1]] <- c(1,2,3)
x[[2]] <- c(4,5,6)
x[[3]] <- c(7,8,9)

现在我这样做:

  

y&lt; - combn(x,2)

y看起来像这样:

      [,1]      [,2]      [,3]     

[1,] Numeric,3 Numeric,3 Numeric,3

[2,] Numeric,3 Numeric,3 Numeric,3

返回一个矩阵,其中的列代表每个集合。但是,我想逐列连接它们,但我不能这样做。

  

cbind(y)的

     [,1]      [,2]      [,3]     

[1,] Numeric,3 Numeric,3 Numeric,3

[2,] Numeric,3 Numeric,3 Numeric,3

应该只有一行,但有两行!另外,当我连接特定元素时,会发生这种情况:

  

C(Y [1,1],Y [2,1])

[[1]]

[1] 1 2 3

[[2]]

[1] 4 5 6

这只是一个例子。实际列表要大得多。我怎么能做到这一点?基本上,我尝试进行k折交叉验证,但数据的每个子集都在列表中。

5 个答案:

答案 0 :(得分:2)

我们可以采用列表索引的组合,并且对于每个组合将两个相应的列表组件组合成一个向量。

要保留列表结构,我们必须将simplify=F传递给combn()

combn(seq_along(x),2L,function(i) c(x[[i[1L]]],x[[i[2L]]]),simplify=F);
## [[1]]
## [1] 1 2 3 4 5 6
##
## [[2]]
## [1] 1 2 3 7 8 9
##
## [[3]]
## [1] 4 5 6 7 8 9
##

实际上有一种更简单的方法:

combn(x,2L,unlist,simplify=F);
## [[1]]
## [1] 1 2 3 4 5 6
##
## [[2]]
## [1] 1 2 3 7 8 9
##
## [[3]]
## [1] 4 5 6 7 8 9
##

答案 1 :(得分:1)

根据您的问题,我认为您想要的是使每个列表成为矩阵中的列。如果不是这样,请更正您的问题。

您要使用的是do.call()。我建议查看此函数的文档(?do.call) - 但是简单地说它会在列表上执行一个函数。

x <- list()
x[[1]] <- c(1,2,3)
x[[2]] <- c(4,5,6)
x[[3]] <- c(7,8,9)

do.call(cbind, x)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

答案 2 :(得分:1)

我们可以在Provider内使用它,因为它有combn参数。

FUN

答案 3 :(得分:0)

您可以在其中创建一个包含combnapply的索引矩阵,do.call(cbind, ...)每对。您需要额外的list()来电,因此apply不会将所有内容简化为一个矩阵:

apply(combn(1:3, 2), 2, function(i){list(do.call(cbind, x[i]))})
## [[1]]
## [[1]][[1]]
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
## 
## 
## [[2]]
## [[2]][[1]]
##      [,1] [,2]
## [1,]    1    7
## [2,]    2    8
## [3,]    3    9
## 
## 
## [[3]]
## [[3]][[1]]
##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8
## [3,]    6    9

这些元素是恼人的嵌套,但purrr::flatten()调用很容易对结构产生影响。

答案 4 :(得分:0)

按照您的示例,由于您的列表长度不相同,您可以尝试:

for(counter in i : ncol(y)){
    newList[[counter]] <- do.call(c, y[1 : 2, counter]
}