R 如何从矩阵中仅选择正行?
这一定是很明显的事情,但不知怎的我弄不明白 假设我有一个矩阵,M是这样的: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
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@MarkSmitabs()
与此处有什么关系?您可以使用abs功能this@MarkSmitabs()
与这里有什么关系?