如何在R中按条件删除含重复核心URL的行
解决Wayback Machine抓取数据的URL去重问题
核心思路是先给每条记录生成不含查询参数的核心URL,再基于这个核心URL对原数据框去重,这样就能完整保留原数据框的所有列信息,而不是只输出链接向量。
方法1:简洁字符串处理法
直接通过字符串操作剥离URL的查询参数部分,再去重:
library(rvest); library(tidyverse); library(stringr) library(httr2); library(janitor) # 原抓取流程不变 link_text = "https://web.archive.org/web/timemap/json?url=https://www.bjjcompsystem.com/tournaments/1869/categories&matchType=prefix&collapse=urlkey&output=json&fl=original,mimetype,timestamp,endtimestamp,groupcount,uniqcount&filter=!statuscode:[45]..&limit=10000&_=1663136483842" %>% request() %>% req_perform() %>% resp_body_json(simplifyVector = TRUE) %>% as_tibble() %>% row_to_names(1) link_text = link_text[-c(1, 788:790),] # 生成核心URL并去重 link_text_dedup <- link_text %>% # 去掉?及后面的所有参数,得到核心URL mutate(core_url = str_remove(original, "\\?.*$")) %>% # 按核心URL去重,保留每组的第一行 distinct(core_url, .keep_all = TRUE) # 查看去重后的完整数据框 head(link_text_dedup)
方法2:规范URL解析法
用httr2的URL解析工具拆分URL各部分,组合出核心路径,适合复杂URL场景:
link_text_dedup <- link_text %>% # 解析每条URL,拆分出协议、主机、路径等部分 mutate(url_parsed = map(original, url_parse)) %>% unnest_wider(url_parsed) %>% # 拼接协议+主机+路径,得到核心URL mutate(core_url = str_c(scheme, "://", hostname, path)) %>% # 去重并保留所有原列 distinct(core_url, .keep_all = TRUE) %>% # 可选:删除解析产生的中间列,让数据框更整洁 select(-scheme, -hostname, -path, -query, -fragment, -url_parsed) head(link_text_dedup)
进阶调整:保留特定行
如果不想保留每组的第一行,而是要保留最新时间戳的记录,可以先排序再去重:
link_text_dedup <- link_text %>% mutate(core_url = str_remove(original, "\\?.*$")) %>% # 按timestamp降序排列,让最新的记录排在前面 arrange(desc(timestamp)) %>% # 去重时就会保留每组的第一条(也就是最新的)记录 distinct(core_url, .keep_all = TRUE)
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

