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

如何批量拆分R数据框列中数值与单位并将单位追加到列名

多列提取数值并追加单位到列名的解决方案

示例数据

df_test <- data.frame(
  ID = c(1:5),
  Length = c("17 mm","20 mm", "32 mm", "69 mm", "100 mm"),
  Vmax = c("17 cm2","20 cm2", "32 cm2", "69 cm2", "100 cm2"),
  Age = c("17 years","20 years", "32 years", "69 years", "100 years"),
  PG = c("17 mmHg","20 mmHg", "32 mmHg", "69 mmHg", "100 mmHg"),
  Weight = c("17 kg","20 kg", "32 kg", "69 kg", "100 kg")
)

需求说明

  • 识别目标列中的单位,将单位追加到原列名后(格式:列名_单位)
  • 列内仅保留数值部分并转为数值类型
  • 支持指定目标列范围处理,兼容列内存在NA值的情况
  • 最终期望输出(修正原示例笔误,Length单位应为mm):
ID Length_mm Vmax_cm2 Age_years PG_mmHg Weight_kg
1  1        17       17        17      17        17
2  2        20       20        20      20        20
3  3        32       32        32      32        32
4  4        69       69        69      69        69
5  5       100      100       100     100       100

方法一:使用tidyverse的mutate(across())实现

适合熟悉tidyverse语法的场景,语法简洁且支持灵活指定目标列:

library(dplyr)

# 定义单列处理函数:提取数值+记录单位
process_col <- function(col) {
  # 从非NA值中提取唯一单位
  unit <- col[!is.na(col)] %>% 
    gsub(".* ", "", .) %>% 
    unique()
  # 提取数值并转为数值类型
  num_val <- as.numeric(gsub(" .*$", "", col))
  # 给数值向量附加单位属性,方便后续重命名列
  attr(num_val, "unit") <- unit
  num_val
}

# 处理目标列并重命名
df_processed <- df_test %>%
  # 指定要处理的列:这里排除ID列,可按需修改
  mutate(across(-ID, process_col)) %>%
  # 按原列名+单位的格式重命名处理过的列
  rename_with(~paste0(., "_", attr(df_test[[.]], "unit")), -ID)

# 查看结果
df_processed

列范围指定方式

  • 按列名指定:across(c(Length, Vmax, Age))
  • 按列位置指定:across(2:6)
  • 排除指定列:across(-ID)或across(-1)

方法二:使用base R的for循环实现

适合习惯base R语法的场景,逻辑直观:

# 指定要处理的目标列:这里选择第2到第6列,可按需修改
target_cols <- 2:ncol(df_test)

# 复制原数据框,避免修改原始数据
df_processed <- df_test

# 循环处理每一列
for (col_idx in target_cols) {
  col_data <- df_processed[[col_idx]]
  # 从非NA值中提取唯一单位
  unit <- gsub(".* ", "", col_data[!is.na(col_data)]) %>% unique()
  # 提取数值并覆盖原列
  df_processed[[col_idx]] <- as.numeric(gsub(" .*$", "", col_data))
  # 重命名列名
  colnames(df_processed)[col_idx] <- paste0(colnames(df_processed)[col_idx], "_", unit)
}

# 查看结果
df_processed

列范围指定方式

  • 按列名指定:target_cols <- c("Length", "Vmax", "Age")
  • 按列位置指定:target_cols <- 2:6

内容的提问来源于stack exchange,提问作者SK_25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:55:04