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

时间:2016-01-18 07:44:35

标签: r aggregate dplyr indicator dummy-variable

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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)]

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

答案 2 :(得分:0)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),按&#34; IP&#34;和&#34;日期&#34;分组,我们创建&#34;机器人&#34;通过将逻辑(.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))