R中的行条件子集

时间:2015-08-16 14:56:11

标签: r matrix subset

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

set.seed(42)
m <- matrix(sample.int(100, 10*10, TRUE), 10, 10)

假设我想创建一个子集,以便保留最大行值为90或更高的行,但删除那些不符合此条件的行。

我能想到这样做的唯一方法是通过if / else循环(max(m[i,]) > 90),但我觉得必须有更优雅的方法来做到这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您可以分几步完成此操作。

首先,在行上使用apply查找行的最大值:

maxima = apply(m, 1, max)
# [1] 92 99 99 98 93 96 98 91 98 84

接下来,获取超过阈值的那些:

above = maxima >= 90
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

现在,使用它来对数据进行子集化:

m[above, ]

或者,在一行中:

m[apply(m, 1, max) >= 90, ]

您可以任意扩展条件。例如,要测试最大值是否在两个值之间,您可以这样做:

between = function (x, lower, upper)
    x >= lower & x <= upper

m[between(apply(m, 1, max), 90, 97), ]