2016-02-01 2 views
1

Учитывая следующие данныеDplyr доступ построчно весь столбец

A B 
1 1 2 
2 2 2 
3 3 3 
4 4 4 
5 5 4 

Для каждой строки я хотел бы найти индекс, где А превышает B в первый раз. Поэтому требуется ответ:

A B NextIndex 
1 1 2   3 
2 2 2   3 
3 3 3   4 
4 4 4   5 
5 5 5   5 

Мой подход с dplyr является

A_col<-foo$A 
foo %>% rowwise() %>% mutate(NextIndex=which(A_col-B>0)[1]) 

Мой фактический data.frame несколько миллионов строк и время обработки резко возрастает. Обратите внимание, что я ссылаюсь на полный A_col в каждом сравнении строк, и я пробовал версию с использованием row_number(), но не добился значительного улучшения скорости. Кроме того, обратите внимание, что A и B на самом деле являются POSIXct переменными в моем файле данных и будут строго возрастать во времени, но не периодическими суммами.

Как повысить эффективность этого выражения?

ответ

1

Мы можем использовать vapply

foo$nextIndex <- vapply(foo$B, function(x) which(foo$A-x>0)[1], 1) 
foo 
# A B nextIndex 
#1 1 2   3 
#2 2 2   3 
#3 3 3   4 
#4 4 4   5 
#5 5 4   5 

Или другой вариант, если значения в порядке

findInterval(foo$B, foo$A)+1L 
#[1] 3 3 4 5 5 

С его помощью в dplyr цепи

foo %>% 
    mutate(rowIndex = findInterval(B, A)+1L) 
+0

@ user5199932 Нет «спасибо», примите ответ. –

0

Как об этом:

df$nextIndex <- apply(df, 1, function(x) which.max(df$A - x[2] > 0)) 
df 
    A B nextIndex 
1 1 2   3 
2 2 2   3 
3 3 3   4 
4 4 4   5 
5 5 4   5 
Смежные вопросы