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

在R语言中整理含特定表头的数据:需求与问题求助

R语言中实现特定格式的数据整理解决方案

原始数据

df <- read.table(text=" ID   Class1a Time1a  MD1a    MD2a    Class1b Time1b  MD1b    MD2b    Class2a Time2a  MD3a    MD4a    Class2b Time2b  MD3b    MD4b    Class3a Time3a  MD5a    MD6a    Class3b Time3b  MD5b    MD6b
1   1   1   1   2   2   1   1   2   9   2   2   2   10  2   1   1   17  3   2   2   18  3   1   1
2   3   1   1   1   4   1   2   1   11  2   2   1   12  2   1   1   19  3   2   1   20  3   1   1
3   5   1   2   1   6   1   2   2   13  2   1   1   14  2   2   2   21  3   1   1   22  3   2   2
4   7   1   1   1   8   1   2   2   15  2   1   1   16  2   1   1   23  3   1   1   24  3   1   1
", header=TRUE)

期望输出格式

ID  Class   Time    MD  MD1 MD2
1   1   1   1-2 1   2
2   3   1   1-2 1   1
3   5   1   1-2 2   1
4   7   1   1-2 1   1
1   2   1   1-2 1   2
2   4   1   1-2 2   2
3   6   1   1-2 2   2
4   8   1   1-2 2   2
1   9   2   3-4 2   2
2   11  2   3-4 2   1
3   13  2   3-4 1   1
4   15  2   3-4 1   1
1   10  2   3-4 2   1
2   12  2   3-4 2   1
3   14  2   3-4 2   2
4   16  2   3-4 2   1
1   17  3   5-6 2   2
2   19  3   5-6 2   2
3   21  3   5-6 1   2
4   23  3   5-6 1   2
1   18  3   5-6 1   1
2   20  3   5-6 1   1
3   22  3   5-6 2   2
4   24  3   5-6 1   1

问题分析

你之前尝试的两次pivot_longer没有正确关联分组(比如Class1a/Time1a/MD1a/MD2a是一组,Class1b/Time1b/MD1b/MD2b是另一组),无法匹配对应字段,因此得不到目标格式。

正确解决方案

使用tidyverse工具包,通过正则提取分组标识,统一整理字段:

library(tidyverse)

# 拆分非ID列为长格式,提取分组标识
df_long <- df %>%
  pivot_longer(
    cols = -ID,
    names_to = c(".value", "group"),
    names_pattern = "(Class|Time|MD\\d)(\\w+)"
  )

# 整理MD列范围,统一MD1/MD2字段
result <- df_long %>%
  mutate(
    # 提取分组中的数字部分
    group_num = str_extract(group, "\\d"),
    # 生成MD列的范围文本
    MD = case_when(
      group_num == "1" ~ "1-2",
      group_num == "2" ~ "3-4",
      group_num == "3" ~ "5-6"
    ),
    # 对应不同分组的MD字段
    MD1 = case_when(
      group_num == "1" ~ MD1,
      group_num == "2" ~ MD3,
      group_num == "3" ~ MD5
    ),
    MD2 = case_when(
      group_num == "1" ~ MD2,
      group_num == "2" ~ MD4,
      group_num == "3" ~ MD6
    )
  ) %>%
  # 选择目标列并排序
  select(ID, Class, Time, MD, MD1, MD2) %>%
  arrange(MD, group)

# 查看结果
print(result, row.names = FALSE)

代码说明

  1. 拆分长格式:利用names_pattern正则表达式,将列名拆分为字段类型(Class/Time/MD等)和分组标识(1a/1b等),确保同一组的字段自动对应。
  2. 生成MD范围:通过分组中的数字,匹配对应的MD范围文本(1对应1-2,2对应3-4等)。
  3. 统一MD字段:将不同分组的MD列(MD1/MD3/MD5对应新MD1,MD2/MD4/MD6对应新MD2)合并到统一字段中。
  4. 整理输出:选择目标字段并按MD和分组排序,得到与期望一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:18