R语言如何按列名公共后缀匹配两组列对应相除并新增结果列
R 实现按列名公共后缀匹配两组列相除的方法
以下提供两种常用实现方案,都可以直接基于你提供的示例数据运行,最终会在原数据框末尾新增3列存储对应除法结果,新列默认命名格式为ratio_后缀名。
方案1:基础 R 实现(无需安装第三方包)
逻辑简单直接,适合对依赖包有要求的场景:
# 示例数据构造 dt <- data.frame(replicate(6,sample(1:15,10,rep=TRUE))) colnames(dt) <- c("prefix1 column1","prefix1 column2","prefix1 column3","prefix2 column1","prefix2 column2","prefix2 column3") # 提取所有prefix1开头的列,得到对应的公共后缀 prefix1_cols <- grep("^prefix1", colnames(dt), value = TRUE) suffixes <- gsub("^prefix1 ", "", prefix1_cols) # 可选:验证后缀是否在prefix2列中全部存在,避免匹配报错 prefix2_cols <- grep("^prefix2", colnames(dt), value = TRUE) prefix2_suffixes <- gsub("^prefix2 ", "", prefix2_cols) stopifnot(all(suffixes %in% prefix2_suffixes)) # 遍历后缀计算比值,新增到原数据框 for (suf in suffixes) { # 若需要处理除以0的情况,可替换为下方注释的代码 # dt[[paste0("ratio_", suf)]] <- ifelse(dt[[paste0("prefix2 ", suf)]] == 0, NA, dt[[paste0("prefix1 ", suf)]]/dt[[paste0("prefix2 ", suf)]]) dt[[paste0("ratio_", suf)]] <- dt[[paste0("prefix1 ", suf)]] / dt[[paste0("prefix2 ", suf)]] } # 查看结果 head(dt)
方案2:tidyverse 实现(写法简洁灵活)
基于dplyr的across语法实现,代码更简洁,适合已经在使用tidyverse生态的场景:
library(dplyr) library(stringr) # 示例数据构造(如果已经构造过可跳过) dt <- data.frame(replicate(6,sample(1:15,10,rep=TRUE))) colnames(dt) <- c("prefix1 column1","prefix1 column2","prefix1 column3","prefix2 column1","prefix2 column2","prefix2 column3") # 提取公共后缀 suffixes <- str_remove(colnames(dt)[startsWith(colnames(dt), "prefix1")], "^prefix1 ") # 批量计算比值并新增列 dt <- dt %>% mutate(across(all_of(paste0("prefix1 ", suffixes)), .fns = ~.x / get(str_replace(cur_column(), "^prefix1", "prefix2")), .names = "ratio_{str_remove(.col, '^prefix1 ')}")) # 查看结果 head(dt)
内容的提问来源于stack exchange,提问作者gkoul
相关产品推荐
相关产品推荐

