You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐行比较两个含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:29:55