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

如何在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)

代码说明

  1. 拆分分组:原数据分为Time1和Time2两个独立分组,分别处理避免列对应混乱
  2. KO列转长:用pivot_longer将KO1a/Ko1b(KO2a/Ko2b)转为纵向的Ko列,同时标记分组类型
  3. 匹配P列:根据KO分组类型,生成对应的P列名称列表并展开为多行
  4. 赋值value:通过case_when将对应P列的数值映射到value列
  5. 合并排序:将两个分组结果合并,按ID、Time、Ko排序得到目标格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:01:26