dplyr中多个聚合条件的子集划分

dplyr中多个聚合条件的子集划分,r,aggregate,dplyr,indicator,dummy-variable,R,Aggregate,Dplyr,Indicator,Dummy Variable,我希望有人知道dplyr中的一个简单/高效的方法,在这个方法中,我可以定义一个指示符变量,如果在日期X,IP地址出现>50次,那么它的值为1。数据有两列,一列是IP地址,另一列是相关的访问日期 例如,我希望Robot列中有以下输出(假设日期/IP组合>=3) 谢谢 您可以通过将这两个变量分组,并使用n()测试当天有多少个地址 group_by(df,date,ip) %>% mutate(keep=as.numeric(n() > 50)) 您可以通过将这两个变量分组,并使

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

例如,我希望Robot列中有以下输出(假设日期/IP组合>=3)



谢谢

您可以通过将这两个变量分组,并使用
n()
测试当天有多少个地址

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

您可以通过将这两个变量分组,并使用
n()
测试当天有多少个地址

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

对于效率,
数据中的相同逻辑。表

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)]
库(data.table)
DT=3,1,0),keyby=(IP,日期)]

当然,如果希望50作为阈值,则需要将条件更改为
.N>=50

对于效率,
数据中的相同逻辑。表

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)]
库(data.table)
DT=3,1,0),keyby=(IP,日期)]

当然,如果希望50作为阈值,则需要将条件更改为
.N>=50

我们可以使用
数据表。将“data.frame”转换为“data.table”(
setDT(df1)
),按“IP”和“Date”分组,我们通过将逻辑(
.N>=3
)转换为二进制表示来创建“Robot”。这可以通过对逻辑向量使用
+
或使用函数
作为.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))

我们可以使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“IP”和“Date”分组,我们通过将逻辑(
.N>=3
)转换为二进制表示来创建“Robot”。这可以通过对逻辑向量使用
+
或使用函数
作为.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))

请出示一个小的复制品example@akrun,包括在上面!谢谢请出示一个小的复制品example@akrun,包括在上面!谢谢您不需要在这里使用
ifesle
,只要
groupby(df,IP,Date)%%>%变异(keep=as.numeric(n()>2))
就可以了。您不需要在这里使用
ifesle
,只要
groupby(df,IP,Date)%%变异(keep=as.numeric(n()>2))
就可以了。