将函数应用于数据框的每一列
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)
我有以下(非常大的)数据框:
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)