【问题标题】:i need to find the first negative number in each column of a matrix我需要在矩阵的每一列中找到第一个负数
【发布时间】: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] 的第一个匹配项

【问题讨论】:

    标签: r matrix vector match


    【解决方案1】:

    我们可以使用max.colties.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")
    

    【讨论】:

    • 谢谢你我用了第二个,我知道肯定有负数所以不需要检查
    • @MatteoEsposito 如果它对您有用,您可以考虑接受投票,以便将其标记为已解决。你可以阅读更多关于它的信息here
    【解决方案2】:

    替代修改 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2013-03-17
      • 2014-06-03
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多