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

R 如何从矩阵中仅选择正行?,r,select,matrix,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.04

这一定是很明显的事情,但不知怎的我弄不明白

假设我有一个矩阵,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
我想用一个矩阵的子集,它只包含行,其中names.*列中的所有值都是正数


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

您可以使用
grep
为以
name
开头的列名创建列索引。然后
子集
这些列,并检查元素是否大于(
)0。然后用
rowSums
对逻辑索引的每一行求和,并检查其是否等于
indx
length
。使用该选项对
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
或者您可以使用
apply
MARGIN=1
来检查每行的条件。但是,对于大型数据集,这种方法可能会慢一些。(摘自@David Arenburg的评论)

数据
m1您可以使用
grep
为以
name
开头的列名创建列索引。然后
子集
这些列,并检查元素是否大于(
)0。然后用
rowSums
对逻辑索引的每一行求和,并检查其是否等于
indx
length
。使用该选项对
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
或者您可以使用
apply
MARGIN=1
来检查每行的条件。但是,对于大型数据集,这种方法可能会慢一些。(摘自@David Arenburg的评论)

数据
m1就个人而言,我会使用
行和
执行此类任务,但您也可以使用另一种基于
%*%
运算符的方法(出于乐趣):

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
indx 0)%*%t(mat[,indx]>0)
mat[colnames(xx)[diag(xx)=长度(indx)],]
#A B name.C name.D name.E
#第6行0.03888397 0.08489596 0.7446663 0.007047967 0.2482858
#第7排0.03633994 0.08106041 0.6894741 0.072244028 0.2382819
#第8排0.03379592 0.07785605 0.6342819 0.137440088 0.2282780

就个人而言,我会使用
行和
执行此类任务,但您也可以使用另一种基于
%*%
运算符的方法(出于乐趣):

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
indx 0)%*%t(mat[,indx]>0)
mat[colnames(xx)[diag(xx)=长度(indx)],]
#A B name.C name.D name.E
#第6行0.03888397 0.08489596 0.7446663 0.007047967 0.2482858
#第7排0.03633994 0.08106041 0.6894741 0.072244028 0.2382819
#第8排0.03379592 0.07785605 0.6342819 0.137440088 0.2282780

从@Akrun在一条直线上获取数据将是:

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

which(m1[,3:5] < 0)
which(m1[,3:5]<0)
提供您感兴趣的列中负数的索引
使用
%%nrow(m1)
可以得到行索引,在其中可以找到负数。您使用
unique
,因为我们只对unique行感兴趣。

从@Akrun获取一行以上的数据将是:

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

which(m1[,3:5] < 0)
which(m1[,3:5]<0)
提供您感兴趣的列中负数的索引
使用
%%nrow(m1)
可以得到行索引,在其中可以找到负数。您可以使用
unique
,因为我们只对unique行感兴趣。

您可以使用abs功能this@MarkSmit
abs()
与此处有什么关系?您可以使用abs功能this@MarkSmitabs()
与这里有什么关系?