我有一个列表,我正在尝试从中选择一个特定的数字。例如:
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折交叉验证,但数据的每个子集都在列表中。
答案 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)
您可以在其中创建一个包含combn
和apply
的索引矩阵,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]
}