我正试图找出一种对矩阵进行子集化的方法,这种矩阵纯粹是数字的(即没有列/行名称)。为了把它放在一个工作示例的形式中,我想删除不符合逻辑条件的行。
set.seed(42)
m <- matrix(sample.int(100, 10*10, TRUE), 10, 10)
假设我想创建一个子集,以便保留最大行值为90或更高的行,但删除那些不符合此条件的行。
我能想到这样做的唯一方法是通过if / else循环(max(m[i,]) > 90
),但我觉得必须有更优雅的方法来做到这一点。
有什么想法吗?
答案 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), ]