查找前半部分与后半部分匹配的字符串
Find strings where the first half matches the second
我有一个由“::”分隔的 IP 地址对列表。
ip_pairs <- c("104.124.199.136::192.168.1.67", "104.124.199.136::192.168.137.174", "192.168.1.67::104.124.199.136", "192.168.137.174::104.124.199.136")
如您所见,向量的第三个和第四个元素与前两个元素相同,但相反(我的实际问题是找到所有唯一的 IP 对,因此解决方案将删除对 B::A 如果 A::B 已经存在。我猜这可以使用 stringr 或正则表达式来解决。
使用 read.table
从对中创建一个两列数据框,对每一行进行排序并使用 duplicated
查找重复项。然后提取非重复项。没有使用包。
DF <- read.table(text = ip_pairs, sep = ":")[-2]
ip_pairs[! duplicated(t(apply(DF, 1, sort)))]
## [1] "192.168.1.67::104.124.199.136" "192.168.137.174::104.124.199.136"
一个选项:
library(stringr)
split_function = function(x) {
x = sort(x)
paste(x, collapse="::")
}
pairs = str_split(ip_pairs, "::")
unique(sapply(pairs, split_function))
[1] "104.124.199.136::192.168.1.67" "104.124.199.136::192.168.137.174"
我有一个由“::”分隔的 IP 地址对列表。
ip_pairs <- c("104.124.199.136::192.168.1.67", "104.124.199.136::192.168.137.174", "192.168.1.67::104.124.199.136", "192.168.137.174::104.124.199.136")
如您所见,向量的第三个和第四个元素与前两个元素相同,但相反(我的实际问题是找到所有唯一的 IP 对,因此解决方案将删除对 B::A 如果 A::B 已经存在。我猜这可以使用 stringr 或正则表达式来解决。
使用 read.table
从对中创建一个两列数据框,对每一行进行排序并使用 duplicated
查找重复项。然后提取非重复项。没有使用包。
DF <- read.table(text = ip_pairs, sep = ":")[-2]
ip_pairs[! duplicated(t(apply(DF, 1, sort)))]
## [1] "192.168.1.67::104.124.199.136" "192.168.137.174::104.124.199.136"
一个选项:
library(stringr)
split_function = function(x) {
x = sort(x)
paste(x, collapse="::")
}
pairs = str_split(ip_pairs, "::")
unique(sapply(pairs, split_function))
[1] "104.124.199.136::192.168.1.67" "104.124.199.136::192.168.137.174"