我有matrix M
,第一个5 rows
和columns
在下面给出
[,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
(即没有循环但是子集)做到这一点?
答案 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
基于'值'列,summarise
为list
在按'Var1'(行索引)
library(reshape2)
library(tidyverse)
melt(M) %>%
filter(value > 0.3) %>%
group_by(Var1) %>%
summarise(value = list(value))