【问题标题】:Column index of last occurrence of value in each row每行中最后一次出现值的列索引
【发布时间】:2013-06-06 15:38:51
【问题描述】:

我需要确定矩阵每一行中特定值的第一次和最后一次出现的列索引。例如,如果我的矩阵如下:

 0  10  10  10   0   0
10  10  10   0   0   0
 0   0   0   0  10  10

我需要一个向量,其中包含每行中第一次出现 10 的列索引和最后一次出现的向量,结果向量将分别为 (2,1,5)(4,3,6)

我编写了以下函数,将它与 apply 函数一起使用来查找第一个匹配项:

Myfunc   <- function(x){which==10)[1]
Myfirst  <- apply(x,1,Myfunc)

但是,我似乎无法弄清楚如何获得最终出现的向量。有人可以告诉我如何使用which() 函数来执行此操作或建议一种替代方法吗?

【问题讨论】:

    标签: r indexing apply


    【解决方案1】:
    v1 = apply(df,1,function(x){head(which(x==10),1)}) #First 
    v2 = apply(df,1,function(x){tail(which(x==10),1)}) #Last
    

    一个成功的例子:

    df = rbind(c(0,10,10,10,0,0),c(10,10,10,0,0,0),c(0,0,0,0,10,10))
    
    > df
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    0   10   10   10    0    0
    [2,]   10   10   10    0    0    0
    [3,]    0    0    0    0   10   10
    
    v1 = apply(df,1,function(x){head(which(x==10),1)}) #First 
    > v1
    [1] 2 1 5
    > is.vector(v1)
    [1] TRUE
    
    v2 = apply(df,1,function(x){tail(which(x==10),1)})
    > v2
    [1] 4 3 6
    > is.vector(v2)
    [1] TRUE
    

    【讨论】:

    • rmk,感谢您的回复。我尝试了你的建议,但它返回了一个列表而不是一个向量,我找不到将它转换回向量的方法。也许,我错过了什么。
    • 如果您的 data.frame 有行/列名称,v1v2 应该附带名称,但据我所知,它们仍然应该是向量。尝试dput(df)head(df) 发布一些数据以获得更多说明。
    • 绝妙的解决方案,对于第一次和最后一次出现都像魅力一样。
    【解决方案2】:

    @rmk 的回答会起作用 (+1)。您可能还对doBy 包感兴趣。它包含一个firstobs() 和一个lastobs() 函数,可以满足您的需求。例如,您可以将它们替换为 @rmk 的手写函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多