通过 dplyr 中的多个聚合条件进行子集化

Subsetting by multiple aggregate conditions in dplyr

我希望有人知道 dplyr 中的 easy/efficient,我可以在其中定义一个指示变量,如果在日期 X 上 IP 地址出现 >50 次,则取值 1。数据有两列,一列是 IP 地址,另一列是关联的访问日期。

例如,我想在 Robot 列中输出以下内容(假设 Date/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

谢谢!

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

group_by(df,date,ip) %>% 
  mutate(keep=as.numeric(n() > 50))

为了提高效率,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作为阈值时。

我们可以使用 data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按 "IP" 和 "Date" 分组,我们通过转换逻辑 (.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))