在R中批量将单元格内容转为列名并添加分析物前缀
解决DataFrame批量重命名与行清理问题
需求说明
- 原始数据
dat0包含1000+行、800+列,前4列为固定列,从第5列(V4)开始每8列对应一个分析物 - 每组8列需添加对应分析物作为前缀,其中每组第一列要将第一行的代码作为后缀(如
V4改为CK_126) - 最终移除前2行,得到目标格式
dat1
解决方案(R代码)
library(dplyr) library(purrr) # 定义分组参数 start_col <- 5 # 从第5列开始分组 group_size <- 8 # 每组8列 total_groups <- (ncol(dat0) - start_col + 1) %/% group_size # 提取每个分组的分析物名称和第一列代码 group_info <- purrr::map_dfr(1:total_groups, function(i) { col_start <- start_col + (i - 1) * group_size code <- dplyr::pull(dat0[1, col_start]) analyte <- dplyr::pull(dat0[1, col_start + 1]) dplyr::tibble(analyte = analyte, code = code, col_range = col_start:(col_start + group_size - 1)) }) # 处理前4列:将V1-V3重命名为第2行的内容 dat_processed <- dat0 %>% dplyr::rename_with(~ dplyr::pull(dat0[2, .x]), dplyr::starts_with("V") %>% head(3)) # 批量重命名每组8列 for (i in 1:nrow(group_info)) { cols <- group_info$col_range[[i]] # 生成后缀:第一列用代码,其余用第2行的字段名 suffixes <- c(group_info$code[i], dplyr::pull(dat0[2, cols[-1]])) new_names <- paste(group_info$analyte[i], suffixes, sep = "_") dat_processed <- dat_processed %>% dplyr::rename_with(~ new_names, dplyr::all_of(cols)) } # 移除前2行,转换数值列 dat1_final <- dat_processed %>% dplyr::slice(-(1:2)) %>% dplyr::mutate(dplyr::across(dplyr::matches("_[0-9]+$"), as.numeric)) # 验证与目标数据一致 all.equal(dat1_final, dat1)
代码说明
- 分组信息提取:计算总组数,获取每个分组的分析物名称(每组第2列第一行)和第一列代码(每组第1列第一行)
- 前4列重命名:将
V1-V3替换为第2行对应的run、type、nb - 批量列重命名:循环处理每个分组,生成
分析物_后缀的列名,第一列后缀为代码,其余列后缀为第2行的字段名 - 行清理与类型转换:移除前2行,将以数字结尾的列转为数值类型,匹配目标数据格式
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

