我有一个data.table对象,其中包含时间戳(以午夜后的秒数为单位)。我的目标是运行一个函数,该函数为每行返回在观察前max $k$秒发生的观察数。
require(data.table, dplyr, dtplyr)
set.seed(123)
DF <- data.frame(Secs=cumsum(rexp(10000,1)))
setDT(DF)
> DF
Secs
1: 8.434573e-01
2: 1.420068e+00
3: 2.749122e+00
4: 2.780700e+00
5: 2.836911e+00
---
9996: 1.003014e+04
9997: 1.003382e+04
9998: 1.003384e+04
9999: 1.003414e+04
10000: 1.003781e+04
我想应用到每一行的函数是
nS<-function(Second,k=5)
max(1,nrow(DF%>%filter(Secs<Second & Secs>=Second-k)))
获得我想要的内容的一种方法是使用apply,这需要相当长的时间。
system.time(val <- apply(DF,1,nS))
User System verstrichen
20.56 0.03 20.66
#Not working
DF%>%mutate(nS=nS(Secs,100))%>%head()
# Also not working
library(lazyeval)
f = function(col1, new_col_name) {
mutate_call = lazyeval::interp(~ nS(a), a = as.name(col1))
DF%>%mutate_(.dots=setNames(list(mutate_call),new_col_name))
}
head(f('Secs', 'nS'))
DF%>%mutate(minTime=Secs-k)%>%head()
用mutate能不能做到这一点呢?非常感谢您的帮助!
2条答案
按热度按时间kg7wmglp1#
使用
rowwise()
对您有用吗?在我的机器上,它只比
apply
稍微快一点。jchrr9hc2#
如果你完全不使用dplyr,下面是非常快的:
该函数假定
s
按升序排序。此函数的结果略有不同:即使与前一个时间戳的差值已经大于k,您的代码也会给出一个计数。但这很容易调整,然后结果是相同的:
打印出'[1] TRUE'。请注意,此实现快得多: