2013-06-10 3 views
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), соответственно.

я написал следующую функцию, используемую его с помощью функции применяются, чтобы найти первое вхождение:

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

Однако, я не могу показаться, чтобы выяснить, как получить вектор для окончательного появления. Может ли кто-нибудь показать мне, как использовать функцию which() для этого или предложить альтернативный метод?

Благодаря

ответ

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 
+0

rmk, спасибо за ответ. Я попробовал ваше предложение, но он вернул список вместо вектора, и я не могу найти способ его преобразования обратно в вектор. Возможно, я что-то упускаю. – jlaufenb

+0

Если ваш data.frame имеет имена строк/col, 'v1' и' v2' должны поставляться с прикрепленными именами, но они все равно должны быть векторами, насколько я знаю. Попробуйте 'dput (df)' или 'head (df)', чтобы опубликовать некоторые данные для получения дополнительных разъяснений. – harkmug

+0

Блестящее решение, работает как очарование как для первого, так и для последнего случая. –

0

@ ответ RMK будет работать (+1). Вы также можете быть заинтересованы в пакете . Он содержит firstobs() и функцию lastobs(), которая будет делать то, что вы хотите. Вы могли бы, например, заменить их на рукописные функции @ rmk.

Смежные вопросы