关于r:每行中最后出现的值的列索引

Column index of last occurrence of value in each row

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

1
2
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函数结合使用以查找第一次出现的情况:

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

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


1
2
v1 = apply(df,1,function(x){head(which(x==10),1)}) #First
v2 = apply(df,1,function(x){tail(which(x==10),1)}) #Last

一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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的答案将起作用(1)。您可能也对doBy软件包感兴趣。它包含一个firstobs()和一个lastobs()函数,可以执行您想要的操作。例如,您可以将其替换为@rmk \\的手写功能。