0

我希望有人知道 dplyr 中的一种简单/高效的方法,我可以在其中定义一个指示变量,如果在 Date X 上,IP 地址存在 >50 次,则取值为 1。数据是两列,一列是 IP 地址,另一列是相关的访问日期。

例如,我希望机器人列中的以下输出(假设日期/IP 组合 >=3)。

IP Date Robot
1   A   1
1   A   1
1   A   1
1   B   0
2   B   0
2   C   1
2   C   1
2   C   1
3   C   0
3   D   0
4   A   0

谢谢!

4

3 回答 3

4

您可以group_by使用这两个变量n()来测试当天有多少地址。

group_by(df,date,ip) %>% 
  mutate(keep=as.numeric(n() > 50))
于 2016-01-18T07:54:26.707 回答
0

对于效率相同的逻辑data.table

library(data.table)

DT <- fread("IP Date
            1   A   
            1   A   
            1   A   
            1   B   
            2   B   
            2   C   
            2   C   
            2   C   
            3   C   
            3   D   
            4   A")

DT[, Robot := ifelse(.N >= 3, 1, 0), keyby = .(IP, Date)]

当然,您需要将条件更改为.N >= 50您希望 50 成为阈值的时间。

于 2016-01-18T22:11:54.137 回答
0

我们可以使用data.table. 将“data.frame”转换为“data.table”(setDT(df1)),按“IP”和“日期”分组,我们通过将逻辑(.N>=3)转换为二进制表示来创建“机器人”。这可以通过使用+逻辑向量或使用函数来完成as.integer

library(data.table)
setDT(df1)[, Robot:= +(.N>=3), .(IP, Date)]

+可以替换为as.integer


或者base R,我们可以使用ave

transform(df1, Robot=as.integer(ave(IP, IP, Date, FUN=length)>=3))
于 2016-01-19T03:04:54.627 回答