You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:06:00