R语言修复按输入索引对齐更新dataframe的自定义函数错误
R函数修复方案
问题根源
原有函数使用%in%做存在性判断,只要v列值存在于V向量、w列值存在于W向量就会触发替换,没有要求V、W是同索引配对的关系,也没有处理V、W同组元素顺序调换的匹配需求。
修复后代码
核心思路是给每组输入的V/W对、原数据的v/w对都生成忽略顺序的唯一匹配键,通过键的一一对应实现精准替换:
library(dplyr) library(purrr) convert_df <- function(df, V, W, E) { # 校验输入参数长度一致 if (length(V) != length(W) || length(V) != length(E)) { stop("输入参数V、W、E的长度必须保持一致") } # 生成匹配对照表:每组V/W对排序后生成唯一键,对应要替换的E值 match_table <- tibble( match_key = map2_chr(V, W, ~ paste(sort(c(.x, .y)), collapse = "|")), new_e = E ) # 原数据生成同规则键,匹配后替换e列 df %>% mutate( row_key = map2_chr(v, w, ~ paste(sort(c(.x, .y)), collapse = "|")), e = coalesce(match_table$new_e[match(row_key, match_table$match_key)], e) ) %>% select(-row_key) }
验证测试
先构造原始数据:
df <- tribble( ~v, ~w, ~e, "dog", "cat", "->", "frog", "cat", "->", "frog", "dog", "->", "frog", "fish", "->", "fish", "cat", "->" )
测试用例1
V <- c('dog', 'cat') W <- c('frog', 'dog') E <- c('<->', '<->') convert_df(df,V,W,E)
输出结果和预期完全一致:
# A tibble: 5 × 3 v w e <chr> <chr> <chr> 1 dog cat <-> 2 frog cat -> 3 frog dog <-> 4 frog fish -> 5 fish cat ->
测试用例2(调换V/W对应元素顺序)
V <- c('frog', 'cat') W <- c('dog', 'dog') E <- c('<->', '<->') convert_df(df,V,W,E)
输出结果同样符合预期:
# A tibble: 5 × 3 v w e <chr> <chr> <chr> 1 dog cat <-> 2 frog cat -> 3 frog dog <-> 4 frog fish -> 5 fish cat ->
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

