鉴于以下数据
A B
1 1 2
2 2 2
3 3 3
4 4 4
5 5 4
对于每一行,我想首次找到A超过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实际上是我的data.frame中的POSIXct
变量,并且会在时间上严格增加,但不会定期增加。
我如何提高这个表达的效率?
答案 0 :(得分: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)
答案 1 :(得分: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