2011-09-30 63 views
0

是否可以从与下面类似的列表中随机抽样一列。带有列表的样本()

list(combinations(4,3,1:4),combinations(4,2,1:4)) 
[[1]] 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 1 2 4 
[3,] 1 3 4 
[4,] 2 3 4 

[[2]] 
    [,1] [,2] 
[1,] 1 2 
[2,] 1 3 
[3,] 1 4 
[4,] 2 3 
[5,] 2 4 
[6,] 3 4 

我试图将列组合成一个1d矩阵的列表,例如。列表(矩阵[,1],矩阵[,2] ...),但遇到了麻烦,以及工作。由于矩阵有不同的维度,我不确定如何去做这件事。

+1

从下面的评论,这是不太清楚你真正想要的。您的示例在两个单独的矩阵中有五列数据。将它们中的任何一个与foo < - c(mat [[1]] [,2],mat [[2]] [,1]'结合起来非常容易),你究竟想要做什么? –

+0

(Echoing卡尔)你是否真的想要显示5列中的一列 - 高度为4(前3)还是6(后2)? –

+0

对不起,我没有写好问题。总之,每个矩阵中没有一列。 –

回答

1

这里有一个办法做到这一点,通过扁平化矩阵转换成列的列表开始:

> library(gtools) 
> matrices <- list(combinations(4,3,1:4),combinations(4,2,1:4)) 
> columns <- do.call(c, lapply(matrices, function(x) as.list(as.data.frame(x)))) 
> columns 
$V1 
[1] 1 1 1 2 

$V2 
[1] 2 2 3 3 

$V3 
[1] 3 4 4 4 

$V1 
[1] 1 1 1 2 2 3 

$V2 
[1] 2 3 4 3 4 4 

> columns[[sample(length(columns), 1)]] 
[1] 1 1 1 2 2 3 
> columns[[sample(length(columns), 1)]] 
[1] 2 3 4 3 4 4 
> columns[[sample(length(columns), 1)]] 
[1] 2 2 3 3 
2

您可以用lapplyas.vectordo.call一个简单的应用程序做到这一点:

l <- list(matrix(1:16,4,4),matrix(1:8,4,2),matrix(1:20,4,5))       
rs <-lapply(l,as.vector) 
matrix(do.call(c,rs),ncol = 1) 

但是,这是我的最后一次尝试。如果你再次改变问题,我只是删除这个并继续前进。 ;)

+1

唯一的问题是,即使有两个子列表,我也想要一个列(总共)。 –

+0

@matt_k希望有帮助。 – joran