3

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

 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()功能来做到这一点或建议一种替代方法吗?

4

2 回答 2

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
于 2013-06-10T21:42:37.607 回答
0

@rmk 的答案将起作用(+1)。您可能还对doBy包感兴趣。它包含一个firstobs()和一个lastobs()功能,可以做你想做的事。例如,您可以将它们替换为@rmk 的手写函数。

于 2013-06-10T23:52:43.027 回答