如何将R语言DataFrame中同前缀行的数值转换为对应列?
R语言DataFrame结构转换方案
要实现将带有前缀的行名转换为列、对应数值按序号排列的需求,以下是两种实用方法:
方法一:使用tidyverse工具链(dplyr + tidyr)
这种方式逻辑清晰,代码可读性强,适合日常数据处理:
library(dplyr) library(tidyr) # 原始数据 df <- data.frame(row_name = c("sha1", "sha2", "edt1", "edt2", "perform1", "perform2"), value = c(10, 20, 30, 40, 50, 60)) # 执行转换 df_new <- df %>% # 从row_name中拆分出前缀(非数字部分)和序号(数字部分) mutate( prefix = sub("(\\D+)(\\d+)", "\\1", row_name), id = as.integer(sub("(\\D+)(\\d+)", "\\2", row_name)) ) %>% # 长格式转宽格式,将前缀作为列名 pivot_wider(names_from = prefix, values_from = value) %>% # 移除不需要的id列 select(-id) # 输出结果 print(df_new)
运行后输出:
sha edt perform 1 10 30 50 2 20 40 60
方法二:基础R原生实现
如果不想依赖第三方包,可使用基础R函数完成转换:
# 原始数据 df <- data.frame(row_name = c("sha1", "sha2", "edt1", "edt2", "perform1", "perform2"), value = c(10, 20, 30, 40, 50, 60)) # 提取前缀和序号 prefixes <- sub("\\d+$", "", df$row_name) ids <- as.integer(sub("^\\D+", "", df$row_name)) # 按前缀分组,按序号排序后提取数值 grouped_data <- tapply(df$value, prefixes, function(x) { x[order(ids[prefixes == unique(prefixes)])] }) # 转换为目标DataFrame df_new <- as.data.frame(do.call(cbind, grouped_data)) # 输出结果 print(df_new)
此方法同样能得到与目标一致的DataFrame结构。
内容的提问来源于stack exchange,提问作者Erik Brole
相关产品推荐
相关产品推荐

