将函数应用于数据框的每一列

Apply function to each column of dataframe

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

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

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

只使用一次 ID 过滤器

subset = df$epoch[which(df$id == id)]
maxTime = max(subset)
minTime = min(subset)

几种方法。在基地 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]

这可以在 dplyr

中轻松完成
require(dplyr)
df %>% group_by(id) %>% summarize(diff=(max(epoch)-min(epoch))/1000)