寻求基于tidyverse构建搜索结果存在性矩阵/数据框的解决方案
Tidyverse方案实现搜索结果存在性矩阵
嗨,我来帮你用tidyverse工具链搞定这个需求!下面给你一个可直接运行的示例,再拆解每一步的逻辑:
1. 模拟示例数据
先构造和你描述一致的测试数据,你可以直接替换成自己的真实数据:
library(tidyverse) # 单个列的唯一搜索结果data frame hit <- tibble(result = c("A", "B", "C", "D", "E")) # 列名为搜索词、行对应查询结果的data frame data <- tibble( term1 = c("A", "C", "E"), term2 = c("B", "D", NA), term3 = c("A", "B", "C") )
2. Tidyverse核心实现代码
下面的代码会一步步把数据转换成你需要的存在性矩阵:
result_matrix <- data %>% # 第一步:把宽格式的搜索结果转成长格式,每个搜索词+结果占一行 pivot_longer( cols = everything(), # 选中所有搜索词列 names_to = "search_term", # 原列名(搜索词)存到新列search_term values_to = "result" # 原单元格值(搜索结果)存到新列result ) %>% # 过滤掉无结果的NA行 filter(!is.na(result)) %>% # 可选:如果同一个搜索词下有重复结果,去重避免重复标记 distinct(search_term, result) %>% # 第二步:和hit做右连接,确保hit里的所有唯一结果都被保留 right_join(hit, by = "result") %>% # 第三步:标记该结果在对应搜索词中是否存在 mutate(exists = ifelse(!is.na(search_term), 1, 0)) %>% # 第四步:转回宽格式,生成最终的存在性矩阵 pivot_wider( names_from = search_term, # 搜索词作为列名 values_from = exists, # 存在标记作为单元格值 values_fill = 0 # 缺失值(即结果未出现在该搜索词中)填充为0 ) # 查看结果 print(result_matrix)
运行后会得到这样的输出:
# A tibble: 5 × 4 result term1 term2 term3 <chr> <dbl> <dbl> <dbl> 1 A 1 0 1 2 B 0 1 1 3 C 1 0 1 4 D 0 1 0 5 E 1 0 0
3. 逻辑拆解
pivot_longer:把原本宽格式的搜索结果表转成长格式,这是tidyverse处理这类匹配问题的常用技巧,让后续的连接和标记操作更直观。right_join:确保hit里的所有唯一结果都被保留,哪怕某个结果没有出现在任何搜索词的结果中(这类结果会在所有搜索词列显示0)。pivot_wider:把标记好的长格式数据转回你需要的矩阵样式,values_fill = 0自动补全未匹配到的情况。
内容的提问来源于stack exchange,提问作者Mr_J
相关产品推荐
相关产品推荐

