我有以下(非常大)的数据框:
id epoch
1 0 1.141194e+12
2 1 1.142163e+12
3 2 1.142627e+12
4 2 1.142627e+12
5 3 1.142665e+12
6 3 1.142665e+12
7 4 1.142823e+12
8 5 1.143230e+12
9 6 1.143235e+12
10 6 1.143235e+12
对于每个唯一ID,我现在想要获得其最大和最小时间(纪元时间戳)之间的差异。如果相关,则存在比上述示例中更多出现的ID。我还没有和R一起工作,并尝试了以下方法:
unique = data.frame(as.numeric(unique(df$id)))
differences = apply(unique, 1, get_duration)
get_duration = function(id) {
maxTime = max(df$epoch[which(df$id == id)])
minTime = min(df$epoch[which(df$id == id)])
return ((maxTime - minTime) / 1000)
}
它有效,但速度非常慢。什么是更快的方法?
答案 0 :(得分:3)
有两种方法。在基地R
:
tapply(df$epoch,df$id,function(x) (max(x)-min(x))/1000)
使用data.table
:
require(data.table)
setDT(df)
df[,list(d=(max(epoch)-min(epoch))/1000),by=id]
答案 1 :(得分:0)
这可以在>>=
dplyr
答案 2 :(得分:-1)
只使用ID过滤一次
subset = df$epoch[which(df$id == id)]
maxTime = max(subset)
minTime = min(subset)