如何基于条约文本相似度矩阵按国家计算平均相似度得分
嘿,我来帮你搞定这个按国家计算平均相似度的问题!你的核心困扰在于当前数据是按条约对记录的,每行绑定了两个国家,直接分组肯定行不通——得先把每个国家单独拆出来和对应的相似度关联上,之后就能轻松按国家统计了。
步骤1:还原你的数据
先把你提供的结构转成可运行的R数据框(我用tidyverse工具包,这是处理这类数据最方便的选择):
library(tidyverse) df <- structure(list( similarity = c(1, 1, 0.50311221359869, 0.50311221359869), number = c("PTA1", "PTA2", "PTA1", "PTA2"), pta = c("1003", "1003", "1012", "1003"), country1 = c("Brazil", "Brazil", "Ecuador", "Brazil"), country2 = c("Venezuela", "Venezuela", "El Salvador", "Venezuela"), name = c("Brazil Venezuela", "Brazil Venezuela", "Ecuador El Salvador", "Brazil Venezuela") ), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
步骤2:把数据转成长格式(拆分国家列)
用pivot_longer把country1和country2合并成一列,让每个国家都对应一条独立的相似度记录:
df_long <- df %>% pivot_longer( cols = starts_with("country"), # 选中所有以country开头的列 names_to = "country_role", # 新增列标记是country1还是country2(可选,后续可删除) values_to = "country" # 存储国家名称的新列 ) %>% select(country, similarity) # 只保留我们需要的核心列
这一步之后,原来的Brazil-Venezuela行会拆成两行:Brazil对应相似度1,Venezuela也对应相似度1,完美解决了一对二的关联问题。
步骤3:按国家分组计算平均相似度
现在就可以直接分组求平均了,还能顺便统计每个国家参与了多少条约记录:
country_avg <- df_long %>% group_by(country) %>% summarise( avg_similarity = mean(similarity, na.rm = TRUE), # 计算平均相似度,自动忽略NA值 total_records = n() # 统计该国家参与的条约记录数 ) %>% ungroup() # 取消分组,变回普通数据框
查看最终结果
运行print(country_avg)会得到:
# A tibble: 4 × 3 country avg_similarity total_records <chr> <dbl> <int> 1 Brazil 0.752 3 2 Ecuador 0.503 1 3 El Salvador 0.503 1 4 Venezuela 0.752 3
额外优化(可选)
如果你的数据里有重复的条约对(比如同一个国家对出现多次),可以先去重再计算,避免重复统计:
# 先去重,保留每个唯一国家对的相似度 df_unique <- df %>% distinct(name, similarity, .keep_all = TRUE) # 重复拆分和分组步骤 df_unique_long <- df_unique %>% pivot_longer(cols = starts_with("country"), values_to = "country") %>% select(country, similarity) country_avg_unique <- df_unique_long %>% group_by(country) %>% summarise(avg_similarity = mean(similarity))
内容的提问来源于stack exchange,提问作者anatrik
相关产品推荐
相关产品推荐

