首页 > 解决方案 > 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

谢谢

标签: rregexdplyrduplicates

解决方案


这是一种通过正则表达式分组的方法:

方案 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

请注意,它(?<=)包含一个积极的后视组。


推荐阅读