通过 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))
我希望有人知道 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))