逐行比较给定标准的值,每行只写 1 个数字(超过/不超过标准)
Compare values with a given standard row by row and write just 1 number for each row (exceeds / doesn't exceed the standard)
我有一个包含很多行的矩阵。比方说
M = matrix(1:20, nrow = 4, ncol = 5)
我有一个阈值变量,例如
threshold = c(4,7,11,14,17)
现在我要R将矩阵中的每一行与这个阈值按值进行比较,并告诉我该行中是否至少有一个值超过了这个阈值的对应值。即,M[1,1] 应与阈值 [1]、M[1,2] 与阈值 [2] 等进行比较
理想情况下,我想要一个新变量,让我们称之为检查,只有 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个问题:
- 也许这不是解决问题的最好方法?我有很多数据,我认为它可以运行得很慢..
不行,R说:
check = apply (M, MARGIN=1, (ifelse((M[,] < threshold), 1, 0)))
Error in match.fun(FUN) :
'(ifelse((M[, ] < threshold), 1, 0))' is not a function, letter or symbol
就算我只表演
ifelse((M < 阈值), 1, 0)
第一行我得到
[1,] 1 1 1 0 0
这不是真的,因为第一行中没有超过阈值的值。似乎 R 只是将整个第一行与阈值的第一个元素进行比较,然后将整个第二行与第二个值等进行比较,这不是我想要的...
非常感谢!
你可以试试,
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
根据您的评论,
as.integer(rowSums(t((t(M) > threshold) * 1) > 0) > 0)
#[1] 0 1 1 1
apply(M, 1, function(x) max(diag(sapply(x, function(y) y >threshold))))
我有一个包含很多行的矩阵。比方说
M = matrix(1:20, nrow = 4, ncol = 5)
我有一个阈值变量,例如
threshold = c(4,7,11,14,17)
现在我要R将矩阵中的每一行与这个阈值按值进行比较,并告诉我该行中是否至少有一个值超过了这个阈值的对应值。即,M[1,1] 应与阈值 [1]、M[1,2] 与阈值 [2] 等进行比较
理想情况下,我想要一个新变量,让我们称之为检查,只有 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个问题:
- 也许这不是解决问题的最好方法?我有很多数据,我认为它可以运行得很慢..
不行,R说:
check = apply (M, MARGIN=1, (ifelse((M[,] < threshold), 1, 0))) Error in match.fun(FUN) : '(ifelse((M[, ] < threshold), 1, 0))' is not a function, letter or symbol
就算我只表演
ifelse((M < 阈值), 1, 0)
第一行我得到
[1,] 1 1 1 0 0
这不是真的,因为第一行中没有超过阈值的值。似乎 R 只是将整个第一行与阈值的第一个元素进行比较,然后将整个第二行与第二个值等进行比较,这不是我想要的...
非常感谢!
你可以试试,
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
根据您的评论,
as.integer(rowSums(t((t(M) > threshold) * 1) > 0) > 0)
#[1] 0 1 1 1
apply(M, 1, function(x) max(diag(sapply(x, function(y) y >threshold))))