我希望有人知道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
谢谢!
答案 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))