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

如何使用pivot_longer实现多实例多时间点数据的长格式转换?

解决多实例多时间点的宽转长格式问题

针对你手头的多时间点、多实例数据集,要保留ident列,转换为包含time、abc、def的目标格式,可以通过先拆列名转长,再转宽的两步操作实现,具体代码如下:

完整代码示例

library(tidyverse)

# 你的原始数据集
data = data.frame(ident=c("A","B","C","D","E"),
                  M0_abc=c(1,0,1,0,1),
                  M0_def=c(1,1,1,1,0),
                  M3_abc=c(1,1,0,0,0),
                  M3_def=c(0,1,0,1,0))

# 格式转换
data_long <- data %>%
  # 第一步:把所有非ident列拆成time、instance和对应值
  pivot_longer(
    cols = -ident,
    names_to = c("time", "instance"),
    names_sep = "_",  # 直接用下划线拆分列名(比正则更简洁)
    values_to = "value"
  ) %>%
  # 第二步:把instance的不同取值转成列
  pivot_wider(
    names_from = instance,
    values_from = value
  )

执行后得到的结果:

> data_long
# A tibble: 10 × 4
   ident time    abc   def
   <chr> <chr> <dbl> <dbl>
 1 A     M0        1     1
 2 A     M3        1     0
 3 B     M0        0     1
 4 B     M3        1     1
 5 C     M0        1     1
 6 C     M3        0     0
 7 D     M0        0     1
 8 D     M3        0     1
 9 E     M0        1     0
10 E     M3        0     0

关键逻辑说明

  1. 第一步pivot_longer:

    • 用names_sep = "_"将列名(如M0_abc)拆分为time(M0)和instance(abc)两个字段,所有数值统一存入value列,这一步把宽格式数据转成了包含ident、time、instance、value的长格式。
    • 如果你的列名分隔符不是下划线,才需要用names_pattern = "(.*)_(.*)"这种正则表达式来匹配拆分,这里用names_sep更直接高效。
  2. 第二步pivot_wider:

    • 把instance字段的不同取值(abc、def)转为列名,对应的value值填充到对应列下,最终得到你需要的结构。

补充说明

你之前尝试的values_to=c("abc","def")是误区:values_to仅用于指定单个值列的名称,而要处理多实例的列名拆分,需要通过names_to指定拆分后的字段,再结合pivot_wider完成格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:44:56