如何在R中查找最优长度及其对应的单元格引用编号
R中定位最优长度并提取对应单元格引用编号
你的数据集结构参考如下截图,包含3个长度字段、1列最优长度值,以及3个长度列分别对应的单元格引用标识,需要逐行匹配与最优长度相等的长度列,返回其对应的引用编号:
前置准备:构造测试数据集
先构造和截图结构一致的测试数据,你可以替换成自己的真实数据集:
# 示例数据结构和字段命名可根据你的实际表调整 df <- data.frame( len1 = c(12, 15, 9, 21), len2 = c(14, 11, 18, 17), len3 = c(10, 19, 12, 20), opt_len = c(12, 19, 18, 21), ref1 = c("A1", "A2", "A3", "A4"), ref2 = c("B1", "B2", "B3", "B4"), ref3 = c("C1", "C2", "C3", "C4") )
方法1:基础R实现(无依赖包)
不需要安装任何第三方包,直接逐行匹配即可:
df$matched_ref <- apply(df, 1, function(current_row) { # 定位3个长度列中与最优长度相等的列序号 match_pos <- which(current_row[c("len1", "len2", "len3")] == current_row["opt_len"]) # 返回对应序号的引用值 current_row[paste0("ref", match_pos)] })
运行后新增的matched_ref列就是你需要的结果,比如第一行最优长度12对应len1列,返回引用A1;第二行最优长度19对应len3列,返回引用C2,匹配逻辑完全符合需求。
方法2:tidyverse实现(适合管道操作/大样本场景)
如果你日常使用dplyr等tidyverse系列工具,可以用长宽表转换的方式实现,逻辑更易读:
library(dplyr) library(tidyr) df <- df %>% mutate(row_id = row_number()) %>% # 标记行号避免顺序错乱 pivot_longer( cols = matches("^len[1-3]$|^ref[1-3]$"), names_to = c(".value", "col_serial"), names_pattern = "(len|ref)([1-3])" ) %>% filter(len == opt_len) %>% # 筛选长度匹配的记录 select(row_id, matched_ref = ref) %>% left_join(df, ., by = "row_id") %>% select(-row_id)
注意:如果单行存在多个长度列同时等于最优长度的情况,上述代码默认返回第一个匹配到的引用。如果需要返回所有匹配结果,只需要在返回值时用
paste()把多个结果拼接成字符串即可。
内容的提问来源于stack exchange,提问作者aashu sharma
相关产品推荐
相关产品推荐

