我有一个名为dataSessions的数据框,其中我有3列“Timestamp”,“CookieID”,“Name”,超过1,300万行。它已根据CookieID和时间戳进行排序。
我想创建一个名为“Sessions”的新列,根据某些条件显示1或0。
1的标准是:
1) The previous cookie is not the same as the current
2) The time between the same cookieID is over 30 minutes
我试过做一个代码,其中for if循环运行每一行并检查之前是否有CookieID。但是这个过程需要很长时间。 有更快更有效的方法吗?
dataSessions$Test<-lag(dataSessions$CookieID, n = 1)
for (i in 1:length(dataSessions$CookieID)) {
if(dataSessions$CookieID[i] %in% dataSessions$Test[i]) {
dataSessions$New[i] <- 0
} else {
dataSessions$New[i] <- 1
}
}
以下是数据的示例,以及我想要生成的SESSIONS列:
Timestamp CookieID Name SESSIONS
2015-08-28 15:46:03 223284 A 1
2015-09-19 22:26:50 223223 A 1
2015-09-19 22:27:09 223223 A 0
2015-09-19 22:28:11 223223 A 0
2015-09-20 22:29:14 245458 B 1
2015-09-20 22:30:17 245458 B 0
2015-09-20 23:05:01 245458 B 1
2015-09-20 23:06:15 245458 B 0
如图所示,当开始新的CookieID时,或者当CookieID的最后一个条目超过30分钟时,会话数仅为1。
答案 0 :(得分:3)
使用data.table
可能有更快的方法,但与此同时:
dd <- read.csv(header=TRUE,
stringsAsFactors=FALSE,text="
Timestamp,CookieID,Name,SESSIONS
2015-08-28 15:46:03,223284,A,1
2015-09-19 22:26:50,223223,A,1
2015-09-19 22:27:09,223223,A,0
2015-09-19 22:28:11,223223,A,0
2015-09-20 22:29:14,245458,B,1
2015-09-20 22:30:17,245458,B,0
2015-09-20 23:05:01,245458,B,1
2015-09-2023:06:15,245458,B,0")
dd$Timestamp <- as.POSIXct(dd$Timestamp)
查找时间差异(以秒为单位,转换为半小时) - 设置第一次观察到&#34;之前&#34;之间的时间。无限:
dt <- c(Inf,diff(dd$Timestamp)/(60*30))
查找cookie diff:
dcookie <- c(NA,diff(dd$CookieID))
检查两种情况:
dd$SESSIONS <- as.numeric(dcookie!=0 | dt >1)
这里的逻辑是我们正在寻找
的情况dcookie!=0
:之前和当前(数字)Cookie值之间的差异不为零(即Cookie已更改)dt>1
:先前时间戳和当前时间戳之间的差异是&gt; 1个半小时在我们可以进行有效循环的环境中(除了R之外几乎所有语言,例如Python或通过Rcpp
使用C ++代码),我们首先要检查cookie是否相等(比减法更快),然后< em> if cookies相等时进行时间差计算 - 这样可以节省一些时间。
答案 1 :(得分:2)
@BenBolker答案的data.table
替代方法是:
library(data.table)
setDT(df)[, session := +(Timestamp - shift(Timestamp, 1L, "lag") > 1800 |
CookieID != shift(CookieID, 1L, "lag"))
][1, session:=1]
这给出了:
> df
Timestamp CookieID Name session
1: 2015-08-28 15:46:03 223284 A 1
2: 2015-09-19 22:26:50 223223 A 1
3: 2015-09-19 22:27:09 223223 A 0
4: 2015-09-19 22:28:11 223223 A 0
5: 2015-09-20 22:29:14 245458 B 1
6: 2015-09-20 22:30:17 245458 B 0
7: 2015-09-20 23:05:01 245458 B 1
8: 2015-09-20 23:06:15 245458 B 0
使用过的数据:
df <- structure(list(Timestamp = structure(c(1440769563, 1442694410, 1442694429, 1442694491, 1442780954, 1442781017, 1442783101, 1442783175), class = c("POSIXct", "POSIXt"), tzone = ""), CookieID = c(223284L, 223223L, 223223L, 223223L, 245458L, 245458L, 245458L, 245458L), Name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor")), .Names = ("Timestamp", "CookieID", "Name"), row.names = c(NA, -8L), class = "data.frame")