我试图找出一种对矩阵进行子集化的方法,这种矩阵纯粹是数字的(即没有列/行名称).为了把它放在一个工作示例的形式中,我想删除不符合逻辑条件的行.
set.seed(42)
m <- matrix(sample.int(100, 10*10, TRUE), 10, 10)
Run Code Online (Sandbox Code Playgroud)
假设我想制作一个子集,所以我保留最大行值为90或以上的行,但删除那些不符合此条件的行.
我能想到这样做的唯一方法是通过if/else循环(max(m[i,]) > 90
)但我觉得必须有一种更优雅的方式来做到这一点.
有任何想法吗?
您可以使用简单地创建逻辑矩阵m >= 90
.这是可能的,因为它>
是带有matrix
方法的泛型函数(参见?S4groupGeneric
具有类似行为的其他函数).然后,我们可以重新rowSums
检查它并检查条件是否适用,例如
m[rowSums(m >= 90) > 0, ]
Run Code Online (Sandbox Code Playgroud)
这意味着如果任何值等于或大于90,那么肯定最大值也更高 - 所以不需要首先寻找最大值.
另一种选择是使用非常有效的matrixStats
包及其rowMaxs
功能
library(matrixStats)
m[rowMaxs(m) >= 90, ]
Run Code Online (Sandbox Code Playgroud)
根据您的意见,这里有一个可能的矢量化范围解决方案
Maxima <- rowMaxs(m)
m[Maxima >= 90 & Maxima <= 97, ]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
185 次 |
最近记录: |