如何在R语言中将列名中的单位拆分至单独列
在R中拆分列名中的单位到单独列
首先先构造和你示例结构一致的测试数据:
# 构造示例数据框 df <- data.frame( SUBJID = c(2001, 2002), `Dose (mg)` = c(200, 200), `Tmax (h)` = c(5, 5) )
方法一:使用tidyverse工具链(推荐)
借助dplyr和tidyr的组合,可以高效完成列名拆分与格式转换:
library(tidyverse) df_processed <- df %>% # 将非SUBJID的列转为长格式,统一处理指标和单位 pivot_longer(cols = -SUBJID, names_to = "metric", values_to = "value") %>% # 正则提取指标名和单位 extract(metric, into = c("metric_name", "unit"), regex = "(.*) \\((.*)\\)") %>% # 转回宽格式,分别生成数值列和单位列 pivot_wider( id_cols = SUBJID, names_from = metric_name, values_from = c(value, unit), names_sep = "_" ) %>% # 调整列顺序匹配目标格式 select(SUBJID, Dose, Dose_unit, Tmax, Tmax_unit) # 查看处理后的数据 print(df_processed)
核心逻辑是:先把宽表转成便于批量处理的长表,提取指标名和单位后再转回宽表,最后调整列顺序。
方法二:基础R实现(无需额外包)
如果不想加载第三方包,用基础R的字符串处理函数也能完成:
# 获取所有列名 col_names <- colnames(df) # 筛选出带单位(含括号)的列 unit_cols <- grep("\\(.*\\)", col_names, value = TRUE) # 逐个处理带单位的列 for(col in unit_cols) { # 提取指标名:去掉括号及内部内容 metric_name <- gsub(" \\(.*\\)", "", col) # 提取单位:取出括号内的内容 unit <- gsub(".*\\((.*)\\)", "\\1", col) # 重命名原列 colnames(df)[colnames(df) == col] <- metric_name # 添加对应单位列,所有行填充相同单位 df[[paste0(metric_name, "_unit")]] <- unit } # 调整列顺序 df <- df[, c("SUBJID", "Dose", "Dose_unit", "Tmax", "Tmax_unit")] # 查看处理后的数据 print(df)
这种方法通过循环遍历目标列,用正则拆分列名后直接修改原数据框,无需依赖第三方工具。
内容的提问来源于stack exchange,提问作者Dylan Li
相关产品推荐
相关产品推荐

