在R中,矩阵的子集行以获取列表

时间:2018-06-19 06:37:49

标签: r subset

我有matrix M,第一个5 rowscolumns在下面给出

       [,1]         [,2]         [,3]         [,4]         [,5]
[1,] 0.00000000 3.249741e-01 3.288171e-01 3.330941e-01 1.183995e-01
[2,] 0.33606769 2.220446e-16 3.788052e-02 1.891638e-02 2.669093e-01
[3,] 0.41547944 2.514113e-02 2.220446e-16 6.044581e-03 3.363015e-01
[4,] 0.36944317 1.783518e-02 2.043331e-02 1.110223e-16 2.790867e-01
[5,] 0.02374292 2.911900e-01 2.983280e-01 3.102164e-01 1.110223e-16

完整的矩阵要大得多。

我想将row的每个M分配为仅包含值大于columns的{​​{1}}。例如,从0.3开始,我想保留2,3,4,row 1只保留1和3,依此类推。 由于每行包含不同数量的元素,因此结果为row 2

如何有效地为非常大的list(即没有循环但是子集)做到这一点?

1 个答案:

答案 0 :(得分:1)

一个选项可能是将小于0.3的元素更改为NA

replace(M, M <= 0.3, NA)

或者

M *(NA ^(M <= 0.3))

如果我们需要list输出,请创建逻辑矩阵,根据索引提取“M”中的值,并split提取row matrix }

ind <- M > 0.3
split(M[ind], row(M)[ind])

最简单的选择是

apply(M, 1, function(x) x[x > 0.3])

或另一种选择是melt matrix为'long'格式,filter基于'值'列,summariselist在按'Var1'(行索引)

分组后
library(reshape2)
library(tidyverse)
melt(M) %>% 
    filter(value > 0.3) %>%
    group_by(Var1) %>% 
    summarise(value = list(value))