比较给定标准行中的值,并为每行只写一个数字(超过/未超过标准)

问题描述 投票:0回答:2

我有一个包含许多行的矩阵。假设

M = matrix(1:20, nrow = 4, ncol = 5)

而且我有一个阈值变量,例如

threshold = c(4,7,11,14,17)

现在,我希望R将矩阵中的每一行与该阈值逐个值进行比较,并告诉我该行中的至少一个值是否超过此阈值的对应值。即,应将M [1,1]与阈值[1]相比较,将M [1,2]与阈值[2]相比较,等等。

理想情况下,我希望有一个新变量,我们称它为check,它只有1 / FALSE(行中至少有1个值超过阈值)或0 / TRUE(没有这样的值)。到现在为止,我可以编程的是:

check = apply (M, MARGIN=1, (ifelse((M[,] < threshold), 1, 0)))

check = apply (check, MARGIN=1, sum)

check = check == 0

但是有3个问题:

  1. 也许这不是解决问题的最佳方法?我有很多数据,并且我认为它可以运行非常缓慢。.
  2. 这不起作用,R说:

    检查=应用(M,MARGIN = 1,(ifelse((M [,]

  3. 即使我只是表演

    ifelse((M

对于第一行,我得到

[1,]    1    1    1    0    0

这是不正确的,因为第一行中没有超过阈值的值。似乎R只是将整个第一行与threshold的第一个元素进行比较,然后将整个第二行与第二个值进行比较,等等,这不是我想要的...

非常感谢!

r threshold continuous
2个回答
1
投票
apply(M, 1, function(x) max(diag(sapply(x, function(y) y >threshold))))

1
投票

您可以尝试,

rowSums(t(M) > threshold) >= 1
#[1] FALSE  TRUE  TRUE  TRUE  TRUE

要逐行查看它,

t((t(M) > threshold)*1) #---> ...* 1 just converts from logical to integer

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    0    0    0    0    1
#[3,]    0    0    0    1    1
#[4,]    0    1    1    1    1

根据您的评论,

rowSums(t((t(M)>阈值)* 1)> 0)> 0[1]否是是是>

© www.soinside.com 2019 - 2024. All rights reserved.