我需要确定矩阵每行中特定值的第一次和最后一次出现的列索引。例如,如果我的矩阵如下:
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()
函数来执行此操作或建议替代方法吗?
由于
答案 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的手写函数。