【发布时间】:2019-04-23 23:21:38
【问题描述】:
您好,我需要找到矩阵中每个行向量的第一个负数的位置
我尝试过匹配并应用,但它只显示第一个
z<-matrix(c(-3,2,-1,3,2,-2,3,-4,-1),ncol=3)
k<-z<0
h<-apply(k,1,function(x) match(TRUE,k))
我希望它显示 [1,3,2] 但它只显示整个矩阵 [1,1,1] 的第一个匹配项
【问题讨论】:
您好,我需要找到矩阵中每个行向量的第一个负数的位置
我尝试过匹配并应用,但它只显示第一个
z<-matrix(c(-3,2,-1,3,2,-2,3,-4,-1),ncol=3)
k<-z<0
h<-apply(k,1,function(x) match(TRUE,k))
我希望它显示 [1,3,2] 但它只显示整个矩阵 [1,1,1] 的第一个匹配项
【问题讨论】:
我们可以使用max.col 和ties.method = "first" 来获得第一个负数
max.col(z < 0, ties.method = "first")
#[1] 1 3 1
apply 你可以这样做
apply(z < 0, 1, which.max)
这两种方法都要求行中至少有一个负数,否则它将返回第一个索引。为避免这种情况,我们可以使用rowSums 检查该行中是否至少有一个负数,然后使用max.col。没有负值的行将得到 0。
(rowSums(z < 0) > 0) * max.col(z < 0, ties.method = "first")
【讨论】:
替代修改 OP 尝试,
apply(z<0, 1, function(x) which(x)[1])
# [1] 1 3 1
当连续没有负数时,返回 NA,而不是 1。 例如,
z2 <- structure(c(-3, 2, -1, 3, 2, -2, 3, 0, -1), .Dim = c(3L, 3L))
apply(z2<0, 1, function(x) which(x)[1])
[1] 1 NA 1
编辑
快一点是使用匹配功能:
apply(z<0, 1, function(x) match(TRUE, x))
# [1] 1 3 1
【讨论】: