每行中最后一次出现值的列索引

时间:2013-06-10 21:20:15

标签: r indexing apply which

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

 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()函数来执行此操作或建议替代方法吗?

由于

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

@ rmk的回答将起作用(+1)。您可能也对doBy包感兴趣。它包含firstobs()lastobs()函数,可以执行您想要的操作。例如,您可以将它们替换为@ rmk的手写函数。