R语言实现数据框无重复名称配对并计算对应分数差值
R实现数据框无重复两两配对及分数差计算
你已经通过t(combn(df$names,2))拿到了符合要求的无重复名称配对,后续可以通过以下两种方式快速匹配对应分数并计算差值:
方法1:基于已生成的名称配对匹配分数
用match()函数根据名称匹配对应分数,适合你已经写好名称配对逻辑的场景:
# 1. 将名称配对矩阵转为带列名的数据框 name_pairs <- as.data.frame( t(combn(df$names, 2)), stringsAsFactors = FALSE ) colnames(name_pairs) <- c("names_1", "names_2") # 2. 按名称匹配对应分数 name_pairs$scores_1 <- df$scores[match(name_pairs$names_1, df$names)] name_pairs$scores_2 <- df$scores[match(name_pairs$names_2, df$names)] # 3. 计算分数绝对差值 name_pairs$score_diff <- abs(name_pairs$scores_1 - name_pairs$scores_2)
运行后得到的name_pairs就是你需要的扩展数据框,输出结果如下:
names_1 names_2 scores_1 scores_2 score_diff 1 a b 95 55 40 2 a c 95 100 5 3 a d 95 60 35 4 b c 55 100 45 5 b d 55 60 5 6 c d 100 60 40
方法2:直接基于行索引导出配对(效率更高)
combn()本质是生成索引的组合,你可以直接对原数据框的行索引做组合,一次性取出对应名称和分数,省去事后匹配的步骤,数据量较大时推荐使用:
# 生成行索引的两两组合 idx_pairs <- combn(nrow(df), 2) # 直接构建扩展数据框 df_extended <- data.frame( names_1 = df$names[idx_pairs[1, ]], names_2 = df$names[idx_pairs[2, ]], scores_1 = df$scores[idx_pairs[1, ]], scores_2 = df$scores[idx_pairs[2, ]] ) # 计算分数差 df_extended$score_diff <- abs(df_extended$scores_1 - df_extended$scores_2)
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

