如何从矩阵中仅选择正行?

时间:2014-11-14 07:47:24

标签: r select matrix

它必须是非常明显的东西但不知何故我无法弄清楚......

假设我有一个像这样的矩阵M:

       A          B             name.C     name.D         name.E
row 1  0.05160408 0.11090351    1.0206272 -0.318932333    0.2983051
row 2  0.04906006 0.10500725    0.9654350 -0.253736273    0.2883013
row 3  0.04651603 0.09940203    0.9102428 -0.188540213    0.2782974
row 4  0.04397201 0.09413984    0.8550506 -0.123344153    0.2682935
row 5  0.04142799 0.08928137    0.7998585 -0.058148093    0.2582896
row 6  0.03888397 0.08489596    0.7446663  0.007047967    0.2482858
row 7  0.03633994 0.08106041    0.6894741  0.072244028    0.2382819
row 8  0.03379592 0.07785605    0.6342819  0.137440088    0.2282780

我想要一个只包含行的矩阵,其中名称中的所有值。*列都是正数。

我可以生成这样的逻辑矩阵:M[grep("^name",colnames(M))] > 0。但是如何获得实数呢?作为矩阵,再次,不是作为向量?

3 个答案:

答案 0 :(得分:3)

您可以使用grep为以name开头的列名创建列索引。然后subset这些列并检查元素是否大于(>)0。然后使用rowSums对逻辑索引的每一行求和,并检查它是否等于{ {1}}的{​​1}}。使用它来对length的行进行子集化。

indx

另一个选项是将逻辑索引列(m1)转换为 indx <- grep('^name', colnames(m1)) m1[rowSums(m1[,indx]>0)==length(indx),] # A B name.C name.D name.E #row 6 0.03888397 0.08489596 0.7446663 0.007047967 0.2482858 #row 7 0.03633994 0.08106041 0.6894741 0.072244028 0.2382819 #row 8 0.03379592 0.07785605 0.6342819 0.137440088 0.2282780 并使用m1[,indx]>0data.frame <检查每行是否全部TRUE / p>

&

或者您可以使用Reduce m1[Reduce(`&`, as.data.frame(m1[,indx] >0)),] 来检查每一行的条件。但是,对于大型数据集,此方法可能会慢一些。 (来自@David Arenburg的评论)

apply

数据

MARGIN=1

答案 1 :(得分:2)

Personaly我会使用rowSums来执行此类任务,但您也可以使用基于%*%运算符的其他方法(为了好玩):

indx <- grep('^name', colnames(mat)) 
xx = (mat[,indx] >0)%*%t(mat[,indx] >0)
mat[colnames(xx)[diag(xx)==length(indx)],]

#               A          B    name.C      name.D    name.E
# row 6 0.03888397 0.08489596 0.7446663 0.007047967 0.2482858
# row 7 0.03633994 0.08106041 0.6894741 0.072244028 0.2382819
# row 8 0.03379592 0.07785605 0.6342819 0.137440088 0.2282780

答案 2 :(得分:1)

将@Akrun中的数据从oneliner上方获取:

m1[-unique(which(m1[,3:5] < 0) %% nrow(m1)),]

说明:

which(m1[,3:5] < 0)

为您提供您感兴趣的列中负数的索引 并使用%% nrow(m1)获得行索引,您可以在其中找到负数。您使用unique,因为我们只对唯一行感兴趣。