我有一个包含12列的数据框,数据的小预览如下所示:
Unique1 Unique2 Unique3 DateTimeOld Device1 Device2 Device3 MobileTablet Desktop DateTime Date Time
1 da-DK;da;q=0.8;en-US 4131620418 615 2015-06-01 00:06:06 mobile web android computer 1 0 2015-06-01 00:06:00 2015-06-01 00:06:00
2 da-DK;da;q=0.8;en-US 4131620418 615 2015-06-01 00:06:38 mobile web android computer 1 0 2015-06-01 00:06:00 2015-06-01 00:06:00
3 da 537 747 2015-06-01 00:13:23 web 0 1 2015-06-01 00:13:00 2015-06-01 00:13:00
4 da 537 747 2015-06-01 00:14:12 web 0 1 2015-06-01 00:14:00 2015-06-01 00:14:00
5 da 537 747 2015-06-01 00:14:47 web 0 1 2015-06-01 00:14:00 2015-06-01 00:14:00
6 da 537 747 2015-06-01 00:15:13 web 0 1 2015-06-01 00:15:00 2015-06-01 00:15:00
该数据包含许多访问网站的各种用户。前3列用于标识用户,其中每个用户都有自己独特的组合。 我希望删除数据的所有副本,如果下一次用户交互之间的时差与上一次交互相差不到30分钟。
这意味着如果一个唯一的用户" A"已经在00:14访问了该网站,然后在00:15再次访问该网站,则该行应该被删除为00:15-00 :14 = 00:01< 00:30
如果是另一个独特用户" B"在00:07访问了网站,然后在00:40再次访问该网站,然后不应该删除此行,因为00:40-00:07不小于00:30 如果是第三个用户" C"在00:13访问了网站,然后在00:30然后在00:50再次访问该网站,然后应该删除另外两行,因为00:30-00:13 = 00:17< 00:30和00:50 -00:30 = 00:20℃,00:30
我遇到的问题是Unique用户可以交织在一起,所以我看到的是上一行的简单函数减去下一行来计算时间。
答案 0 :(得分:0)
您的用户拆分数据,以便您可以在每个组上运行一个简单的功能。 lapply / split和by是其他选项,但我使用了tapply:
x$timesincelastvisit <- unlist(tapply(x$DateTimeOld,INDEX = paste(x$Unique1,x$Unique2,x$Unique3),function(x){
c(NA,diff(sort(x)))
}))
x[x$timesincelastvisit > 30 | is.na(x$timesincelastvisit), ]
Diff()可能会像我一样使用您的示例数据计算秒数,因此您必须更改&#34;&gt; 30&#34;到&#34;&gt; 30 * 60&#34;