它必须是非常明显的东西但不知何故我无法弄清楚......
假设我有一个像这样的矩阵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
。但是如何获得实数呢?作为矩阵,再次,不是作为向量?
答案 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]>0
和data.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
,因为我们只对唯一行感兴趣。