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

如何在R语言中使用pivot_longer转换指定结构的数据框?

使用pivot_longer重塑数据框

首先看你的原始数据框:

df <- data.frame(
  species = c("species1", "species2", "species3", "species4", "species5", "species6"),
  Position = c("o", "c", "o", "c", "o", "c"),
  MeanPd = c(1.2, 2.5, 3.8, 4.1, 2.3, 1.9),
  sdPd = c(0.5, 0.7, 0.9, 0.6, 0.4, 0.8),
  MeanMd = c(10.2, 9.5, 11.1, 12.4, 10.9, 11.8),
  sdMd = c(1.1, 1.3, 1.6, 1.2, 0.9, 1.4)
)

要转换成包含species、Position、mean、sd的长格式数据框,可以用tidyr里的pivot_longer,核心是通过正则表达式拆分原列名的前缀(Mean/sd)和后缀(Pd/Md),代码如下:

# 先加载tidyverse包(包含tidyr)
library(tidyverse)

df_long <- df %>%
  pivot_longer(
    # 选中所有以Mean或sd开头的列
    cols = starts_with(c("Mean", "sd")),
    # .value表示将列名的匹配前缀作为新列名;metric用来存储Pd/Md标识(可选)
    names_to = c(".value", "metric"),
    # 正则表达式拆分列名:第一组匹配Mean或sd,第二组匹配Pd或Md
    names_pattern = "(Mean|sd)(Pd|Md)"
  ) %>%
  # 将Mean列重命名为mean,sd列重命名为sd,符合需求
  rename(mean = Mean, sd = sd) %>%
  # 如果不需要区分Pd/Md的metric列,就加上这行
  select(-metric)

运行后得到的结果:

df_long
#>      species Position  mean   sd
#> 1  species1        o   1.2  0.5
#> 2  species1        o  10.2  1.1
#> 3  species2        c   2.5  0.7
#> 4  species2        c   9.5  1.3
#> 5  species3        o   3.8  0.9
#> 6  species3        o  11.1  1.6
#> 7  species4        c   4.1  0.6
#> 8  species4        c  12.4  1.2
#> 9  species5        o   2.3  0.4
#> 10 species5        o  10.9  0.9
#> 11 species6        c   1.9  0.8
#> 12 species6        c  11.8  1.4

参数说明

  • cols:指定需要重塑的列,这里用starts_with()快速筛选目标列,避免逐个列名输入
  • names_to:.value是pivot_longer的特殊参数,用来指定提取列名的一部分作为新的列名;metric则存储列名里的指标类型(Pd/Md),如果不需要可以直接去掉这个参数(但要对应调整names_pattern)
  • names_pattern:用正则分组拆分原列名,第一组(Mean|sd)匹配均值或标准差的前缀,对应到新列;第二组(Pd|Md)匹配指标类型,对应到metric列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:54:51