如何逐行比较两个含1、0、-1的R DataFrame行相似度?
解决R数据框逐行相似度计算问题
我来帮你搞定这个需求!要计算两个R数据框每行的相同值占比,其实有好几种简单的实现方式,我给你分享两种最常用的:
方法一:使用Base R(无需额外包)
先把你的示例数据构造出来,然后用apply函数逐行处理:
# 构造示例数据框 df1 <- data.frame(var1 = c(1, -1), var2 = c(1, 0), var3 = c(0, -1)) df2 <- data.frame(var1 = c(-1, 1), var2 = c(1, 0), var3 = c(0, 1)) # 逐行计算相同值的占比 row_similarity <- apply(df1 == df2, 1, mean) row_similarity
代码解释:
df1 == df2会生成一个布尔矩阵,对应位置值相同则为TRUE(等价于1),不同则为FALSE(等价于0)apply(..., 1, mean)指定对行(第二个参数1代表行)计算平均值,也就是相同值的数量占该行总列数的比例- 运行结果是
[1] 0.6666667 0.3333333,正好对应你需要的2/3和1/3
方法二:使用dplyr(适合tidyverse用户)
如果你习惯用tidyverse的语法,可以用dplyr来实现:
library(dplyr) # 绑定数据框并逐行计算相似度 bind_cols(df1, df2) %>% mutate(row_id = row_number()) %>% group_by(row_id) %>% summarize( similarity = mean( c_across(var1:var3) == c_across(paste0("var", 1:3, ".1")) ) ) %>% pull(similarity)
代码解释:
bind_cols(df1, df2)把两个数据框按列合并,合并后df2的列名会自动加上.1后缀(比如var1.1)mutate(row_id = row_number())添加行索引用于分组group_by(row_id)按行分组后,用c_across分别选取两个数据框的列进行比较,再取平均值得到占比pull(similarity)提取最终的相似度结果
小提示:
如果你的两个数据框列名没有自动后缀,只要保证列数相同、顺序对应,也可以用列位置来选取,比如c_across(1:3)对应第一个数据框的列,c_across(4:6)对应第二个数据框的列。
内容的提问来源于stack exchange,提问作者Niccola Tartaglia
相关产品推荐
相关产品推荐

