【发布时间】:2018-04-18 17:01:46
【问题描述】:
我有一个包含三列的数据框:“uuid”(即类因子)和“created_at”(即类 POSIXct)和“trainer_item_id”(因子),我创建了名为“会话”的第三列”。 Sessions 列表示每个 uuid 按时间排序的时间会话,因此任何连续事件对之间的时间差最多为一小时(3600 秒)。
我使用“for 循环”和迭代创建了 Sessions 列。问题是我有超过一百万的观察结果,创建会话需要 8 个小时。有没有比我下面的代码更容易和更快的方法来创建它? 提前感谢您的帮助!
这里是原始数据集的样本 --> https://gist.github.com/einsiol/5b4e633ce69d3a8e43252f383231e4b8
这是我的代码 -->
library(dplyr)
# Converting the data frame trial to tibble in order to use the function group_by
trial <- tbl_df(trial); trial <- group_by(trial, uuid)
# Ordering by timestamp (created_at)
trial <- arrange(trial, created_at)
# Creating empty vector of time difference tdiff
time <- trial$created_at
tdiff <- vector(mode = "numeric",length = 0)
trial$Sessions <- vector(mode = "character",length = length(trial))
count <-1
for(i in 1:(length(trial$uuid)-1)) {
tdiff[i] <- difftime(time[i+1], time[i],units = "secs")
# If same user ID
if (trial$uuid[i+1]==trial$uuid[i]){
if (tdiff[i]<3600){
trial$Sessions[i] <- count
trial$Sessions[i+1] <- count
}else{
trial$Sessions[i] <- count
trial$Sessions[i+1] <- count
count <- count+1
}
# If different user ID
}else{
if (tdiff[i]<3600){
trial$Sessions[i] <- count
trial$Sessions[i+1] <- count
}else{
trial$Sessions[i] <- count
trial$Sessions[i+1] <- count
count <- count+1
}
count <- 1
}
}
更新:我已经找到了我的问题的答案以及您可以在下面找到的此代码的快速替代方案!
【问题讨论】:
-
除了用散文来描述你的数据集,你能包含一个可重现的例子来测试你的代码吗?
-
dput( head( trial, 20 )会有所帮助 -
@DavidKlotz 感谢您的建设性反馈,我已经添加了我的数据集示例 :)
-
是的,但是下次如果您输入
dput(head(trial, 20)),它是可复制/可粘贴的并保留结构(如列类)。下次请使用dput分享数据。
标签: r performance session for-loop large-data