2017-08-28 121 views
1

我试图按行列名排列矩阵列表。R - 按rowname排列矩阵列表

mtx1 <- matrix(data = c(1:12), nrow = 4) 
mtx2 <- matrix(data = c(13:24), nrow = 4) 

row.names(mtx1) <- c("A", "B", "C", "D") 
row.names(mtx2) <- c("A", "B", "C", "D") 

my_list <- c("B", "D") 

mtx_list <- list(mtx1, mtx2) 

到目前为止,我已经尝试

sub_mtx_list <- lapply(mtx_list, subset, row.names(mtx_list) %in% my_list) 

我想我会得到...

[[1]] 
    [,1] [,2] [,3] 
B 2 6 10 
D 4 8 12 

[[2]] 
    [,1] [,2] [,3] 
B 14 18 22 
D 16 20 24 

但是我收到一个空的矩阵集,而不是...

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

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

任何帮助将不胜感激!

+4

'lapply(mtx_list,function(x)x [row.names(x)%in%my_list,])' –

+0

读取'?subset',它说:“这是一个便利功能,旨在交互使用。对于编程,最好使用标准子集函数,特别是参数子集的非标准评估可能会带来意想不到的后果。“ – Frank

回答

1

为了能够获得预期使用此代码是什么:

lapply(mtx_list,function(x) x[row.names(x)%in%c("B","D"),]) 
[[1]] 
    [,1] [,2] [,3]  
    B 2 6 10 
    D 4 8 12 

[[2]] 
    [,1] [,2] [,3] 
B 14 18 22 
D 16 20 24 
1

无需使用subset,你可以直接使用指数:

lapply(mtx_list, function(mat)mat[my_list,]) 

,让你需要的输出:

[[1]] 
    [,1] [,2] [,3] 
B 2 6 10 
D 4 8 12 

[[2]] 
    [,1] [,2] [,3] 
B 14 18 22 
D 16 20 24