R中的行条件子集

jor*_*ite 3 r matrix subset

我试图找出一种对矩阵进行子集化的方法,这种矩阵纯粹是数字的(即没有列/行名称).为了把它放在一个工作示例的形式中,我想删除不符合逻辑条件的行.

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)但我觉得必须有一种更优雅的方式来做到这一点.

有任何想法吗?

Dav*_*urg 6

您可以使用简单地创建逻辑矩阵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)

  • @jordanawhite,虽然你完全忽略了这个答案,但请参阅编辑你的评论. (2认同)