如何在R语言中使用tidyr::pivot_longer完成指定数据格式转换?
解决R语言数据宽转长格式问题
数据转换代码
首先加载所需的tidyr和dplyr包:
library(tidyr) library(dplyr)
接下来分两步处理Time1和Time2对应的分组数据,再合并得到目标格式:
# 处理Time1相关的分组(KO1a/Ko1b + P1-P6 + Time1) df_time1 <- df %>% select(ID, KO1a, Ko1b, P1, P2, P3, P4, P5, P6, Time1) %>% pivot_longer(cols = c(KO1a, Ko1b), names_to = "ko_group", values_to = "Ko") %>% mutate(P_group = case_when( ko_group == "KO1a" ~ list(c("P1", "P2", "P3")), ko_group == "Ko1b" ~ list(c("P4", "P5", "P6")) )) %>% unnest(P_group) %>% mutate(value = case_when( P_group == "P1" ~ P1, P_group == "P2" ~ P2, P_group == "P3" ~ P3, P_group == "P4" ~ P4, P_group == "P5" ~ P5, P_group == "P6" ~ P6 )) %>% select(ID, Ko, Time = Time1, P = P_group, value) # 处理Time2相关的分组(KO2a/Ko2b + P7-P12 + Time2) df_time2 <- df %>% select(ID, KO2a, Ko2b, P7, P8, P9, P10, P11, P12, Time2) %>% pivot_longer(cols = c(KO2a, Ko2b), names_to = "ko_group", values_to = "Ko") %>% mutate(P_group = case_when( ko_group == "KO2a" ~ list(c("P7", "P8", "P9")), ko_group == "Ko2b" ~ list(c("P10", "P11", "P12")) )) %>% unnest(P_group) %>% mutate(value = case_when( P_group == "P7" ~ P7, P_group == "P8" ~ P8, P_group == "P9" ~ P9, P_group == "P10" ~ P10, P_group == "P11" ~ P11, P_group == "P12" ~ P12 )) %>% select(ID, Ko, Time = Time2, P = P_group, value) # 合并两个数据集并排序 final_df <- bind_rows(df_time1, df_time2) %>% arrange(ID, Time, Ko)
代码说明
- 拆分分组:原数据分为Time1和Time2两个独立分组,分别处理避免列对应混乱
- KO列转长:用
pivot_longer将KO1a/Ko1b(KO2a/Ko2b)转为纵向的Ko列,同时标记分组类型 - 匹配P列:根据KO分组类型,生成对应的P列名称列表并展开为多行
- 赋值value:通过
case_when将对应P列的数值映射到value列 - 合并排序:将两个分组结果合并,按ID、Time、Ko排序得到目标格式
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

