如果时间段处于条件

时间:2015-07-28 14:14:46

标签: r duplicates conditional-statements

我有一个包含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用户可以交织在一起,所以我看到的是上一行的简单函数减去下一行来计算时间。

1 个答案:

答案 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;