R语言如何基于相似性数据框填充生成对称相似矩阵
实现方案
直接按以下步骤运行代码即可实现对称填充效果,不需要依赖额外第三方包:
- 首先复现当前已有的数据对象:
# 现有代码生成的初始独热矩阵 df <- data.frame(seasons = c("Season1","Season2","Season3","Season4")) for(i in unique(df$seasons)) { df[[paste0(i)]] <- ifelse(df$seasons==i,1,0) } # 提供的相似性数据框 sim_df <- data.frame( S1 = c("Season1", "Season3", "Season2"), S2 = c("Season2", "Season1", "Season3"), Value = c(3,5,4) )
- 先把相似性配对补为双向对称结构,解决配对顺序不固定的问题:
# 互换S1、S2列生成反向配对,和原配对合并得到全量对称映射 sim_sym <- rbind( sim_df, setNames(sim_df[, c("S2", "S1", "Value")], c("S1", "S2", "Value")) )
- 执行矩阵填充:
# 遍历所有季节列完成值替换 for (col in names(df)[-1]) { # 按「行季节+列季节」的组合匹配对应的相似值 pair_match <- match(paste(df$seasons, col), paste(sim_sym$S1, sim_sym$S2)) fill_val <- sim_sym$Value[pair_match] # 仅替换原矩阵中值为0、且能匹配到相似值的位置,保留对角线的1 df[[col]] <- ifelse(df[[col]] == 0 & !is.na(fill_val), fill_val, df[[col]]) }
运行结果
最终生成的df完全符合对称填充要求:
seasons Season1 Season2 Season3 Season4 1 Season1 1 3 5 0 2 Season2 3 1 4 0 3 Season3 5 4 1 0 4 Season4 0 0 0 1
说明
- 没有录入相似值的配对(示例中Season4和其余三个季节无对应记录)会保留初始值0,可根据需要自行调整替换规则
- 相同季节的对角线位置会固定保留初始值1,不会被相似值覆盖
- 无论原始相似性表中季节对的记录顺序是正序还是倒序,都可以被正确匹配填充
内容的提问来源于stack exchange,提问作者Anjana Lakshmi
相关产品推荐
相关产品推荐

