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
相关产品推荐
相关产品推荐

