如何批量拆分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
相关产品推荐
相关产品推荐

