在R中实现查找与指定行属性匹配或相近的数据行
R实现匹配参考行的筛选函数
我们可以通过以下逻辑实现需求:提取指定参考行,区分数据框中的分类列与数值列,分别构建匹配条件后组合筛选,同时排除参考行本身。
完整代码如下:
# 加载并预处理数据 data <- read.csv("https://raw.githubusercontent.com/hkil/m/master/wcf.csv")[-c(2:6,12,17)] # 实现筛选函数 foo <- function(data = data, reference_row = 116, tolerance_for_numerics = 3) { # 提取参考行:兼容行号或直接传入行数据 if (is.numeric(reference_row)) { ref <- data[reference_row, , drop = FALSE] } else { ref <- reference_row } # 自动区分分类列(字符/因子型)和数值列(整数/数值型) col_types <- sapply(data, function(x) class(x)[1]) cat_cols <- names(col_types[col_types %in% c("character", "factor")]) num_cols <- names(col_types[col_types %in% c("integer", "numeric")]) # 构建分类列的完全匹配条件 cat_conditions <- lapply(cat_cols, function(col) { data[[col]] == ref[[col]] }) # 构建数值列的公差范围内匹配条件 num_conditions <- lapply(num_cols, function(col) { abs(data[[col]] - ref[[col]]) <= tolerance_for_numerics }) # 合并所有条件并排除参考行本身 all_conditions <- Reduce(`&`, c(cat_conditions, num_conditions)) all_conditions[reference_row] <- FALSE # 返回筛选结果 data[all_conditions, , drop = FALSE] } # 使用示例 result <- foo() print(result)
代码说明
- 参考行兼容处理:既支持传入行号,也支持直接传入参考行数据,提升函数灵活性
- 自动列类型识别:无需手动指定列类型,函数自动区分分类列与数值列
- 条件逻辑:
- 分类列要求与参考行对应值完全一致
- 数值列要求与参考行对应值的差值绝对值不超过设定公差
- 排除参考行:确保结果仅包含符合条件的其他行
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

