r - R中IP地址行内基于标准的重复标记
问题描述
如何根据某些标准标记重复的 IP 地址?
例如 ip adressess 共享相同的值,但地址的最后一部分 ( 100.100.10.***
),或 ips 共享相同的值,但最后两位数字 ( 100.100.10.1**
) - 请参阅下面的 3 个场景示例。
到目前为止,我设法找到并标记了任何行的完整副本:
require(dplyr)
data <- data.frame(ip = c("100.100.10.100","100.100.10.101", "100.100.10.102", "100.100.10.113",
"100.100.10.100", "100.100.10.200", "100.100.11.100", "100.100.10.101",
"100.100.10.10", "100.100.10.1"))
data <- data %>%
mutate(ip.dupe =ifelse(duplicated(ip) | duplicated(ip, fromLast = TRUE), 1,0))
data
ip ip.dupe
1 100.100.10.100 1
2 100.100.10.101 1
3 100.100.10.102 0
4 100.100.10.113 0
5 100.100.10.100 1
6 100.100.10.200 0
7 100.100.11.100 0
8 100.100.10.101 1
9 100.100.10.10 0
10 100.100.10.1 0
我正在寻找实现以下场景的方法:
# Scenario 2 - dupes are matches in 100.100.10.***
ip ip.dupe
1 100.100.10.100 1
2 100.100.10.101 1
3 100.100.10.102 1
4 100.100.10.113 1
5 100.100.10.100 1
6 100.100.10.200 1
7 100.100.11.100 0
8 100.100.10.101 1
9 100.100.10.10 1
10 100.100.10.1 1
# Scenario 3 - dupes are matches in 100.100.10.1**
ip ip.dupe
1 100.100.10.100 1
2 100.100.10.101 1
3 100.100.10.102 1
4 100.100.10.113 1
5 100.100.10.100 1
6 100.100.10.200 0
7 100.100.11.100 0
8 100.100.10.101 1
9 100.100.10.10 0
10 100.100.10.1 0
谢谢
解决方案
这是一种通过正则表达式分组的方法:
方案 2
data %>%
group_by(prefix = str_replace(ip,"\\.[0-9]+$","")) %>%
mutate(ip.dupe = c(0,rep(1,n() -1)))
# A tibble: 10 x 3
# Groups: prefix [2]
ip prefix ip.dupe
<fct> <chr> <dbl>
1 100.100.10.100 100.100.10 0
2 100.100.10.101 100.100.10 1
3 100.100.10.102 100.100.10 1
4 100.100.10.113 100.100.10 1
5 100.100.10.100 100.100.10 1
6 100.100.10.200 100.100.10 1
7 100.100.11.100 100.100.11 0
8 100.100.10.101 100.100.10 1
9 100.100.10.10 100.100.10 1
10 100.100.10.1 100.100.10 1
这是场景 3 的表达式:
data %>%
group_by(prefix = str_replace(ip,"(?<=\\.[0-9])[0-9]+$","")) %>%
mutate(ip.dupe = c(0,rep(1,n() -1)))
# A tibble: 10 x 3
# Groups: prefix [3]
ip prefix ip.dupe
<fct> <chr> <dbl>
1 100.100.10.100 100.100.10.1 0
2 100.100.10.101 100.100.10.1 1
3 100.100.10.102 100.100.10.1 1
4 100.100.10.113 100.100.10.1 1
5 100.100.10.100 100.100.10.1 1
6 100.100.10.200 100.100.10.2 0
7 100.100.11.100 100.100.11.1 0
8 100.100.10.101 100.100.10.1 1
9 100.100.10.10 100.100.10.1 1
10 100.100.10.1 100.100.10.1 1
请注意,它(?<=)
包含一个积极的后视组。
推荐阅读
- html - 并排的 html 容器
- android - 当小部件可见时收到通知
- html - Firefox - 当滚动行为平滑开启时,postiton 粘性关闭
- vector - 从借用的 Vec 中删除值时,如何避免移出借用?
- python - OpenAI Gym Atari 游戏、TD Policy 应用
- python - 散景服务器不会提供简单的日期滑块
- debugging - 防止迭代器遍历容器的末端
- android - Cordova - 无法触发 Android 让我选择要上传的图像
- vba - Excel工作表上的实际物理长度与点/像素
- google-chrome - 如何从 chrome 扩展程序调用 Chrome Web Store API 端点?