将函数应用于每列数据框

时间:2015-12-15 21:31:01

标签: r apply

我有以下(非常大)的数据框:

     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)
}

它有效,但速度非常慢。什么是更快的方法?

3 个答案:

答案 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)