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

R语言构建两数据框列值近似匹配函数并返回对应行的实现方法

R函数实现方案

函数实现(tidyverse版本,可读性更高)

依赖dplyr包,代码逻辑清晰易修改:

library(dplyr)

find_matched_pairs <- function(df1, df2, tol = 1e-6) {
  # 全关联匹配df1每一行和df2所有行
  cross_join(df1, df2) %>%
    # 过滤满足近似相等条件的行
    filter(abs((z - x) - y) < tol) %>%
    # 列名加前缀区分两个数据框的来源字段
    rename_with(~paste0("df1_", .x), .cols = all_of(colnames(df1))) %>%
    rename_with(~paste0("df2_", .x), .cols = all_of(colnames(df2)))
}

函数实现(base R版本,无第三方依赖)

不需要安装任何扩展包,适配所有基础R环境:

find_matched_pairs <- function(df1, df2, tol = 1e-6) {
  # 构造两个数据框的笛卡尔积
  cross_df <- merge(df1, df2, by = NULL)
  # 按误差阈值过滤匹配行
  res <- cross_df[abs((cross_df$z - cross_df$x) - cross_df$y) < tol, ]
  # 重命名列区分来源
  colnames(res)[seq_along(colnames(df1))] <- paste0("df1_", colnames(df1))
  colnames(res)[seq_along(colnames(df2)) + length(colnames(df1))] <- paste0("df2_", colnames(df2))
  rownames(res) <- NULL
  return(res)
}

参数说明

  • df1:输入的第一个数据框,必须包含y、z两列
  • df2:输入的第二个数据框,必须包含x列
  • tol:自定义近似误差阈值,默认值为1e-6,可根据业务需求调整大小

使用示例

注意:你提供的df1构造代码参数顺序有误,rep的第一个参数为待重复向量、第二个参数为重复次数,下方示例已修正为可生成你给出的示例格式的代码

# 固定随机种子方便结果复现
set.seed(123)
# 构造测试数据
df1 <- data.frame(n = rep(c(0,1,2,3,4), 2), nn =c(rep(x = 1, 5), rep(x=2, 5)),
                  y = rnorm(10), z = rnorm(10)) 
df2 <- data.frame(x = rnorm(20))

# 调用函数,设置误差阈值为0.1
result <- find_matched_pairs(df1, df2, tol = 0.1)

# 查看匹配结果
head(result)

返回结果中,前缀为df1_的列是df1中符合条件的行的全部字段,前缀为df2_的列是对应匹配到的df2行的全部字段,无匹配时返回空数据框。

内容的提问来源于stack exchange,提问作者user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:54:05