在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)
代码说明
- 拆分长格式:利用
names_pattern正则表达式,将列名拆分为字段类型(Class/Time/MD等)和分组标识(1a/1b等),确保同一组的字段自动对应。 - 生成MD范围:通过分组中的数字,匹配对应的MD范围文本(1对应1-2,2对应3-4等)。
- 统一MD字段:将不同分组的MD列(MD1/MD3/MD5对应新MD1,MD2/MD4/MD6对应新MD2)合并到统一字段中。
- 整理输出:选择目标字段并按MD和分组排序,得到与期望一致的结果。
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

