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

如何在R语言中保留ID列实现数据转置(pivot操作)

数据转置保留ID列问题解决

需求说明

需要将包含ID、TEST(Pre/Post)及Q1-Q3的宽表,转置为保留ID、同时按问题(Q1-Q3)展示Pre/Post对应结果的结构。此前参考的代码无法正确保留ID列,现寻求可行方案。

原始数据

data <- data.frame(
  stringsAsFactors = FALSE,
  ID = c(15262L,17382L,14892L,15262L,17382,14892L),
  TEST = c("Pre", "Pre","Pre", "Post", "Post","Post"),
  Q1 = c(2L, 5L,3L,3L,2L,4L),
  Q2 = c(3L,4L,5L,3L,4L,5L),
  Q3 = c(4L,3L,3L,2L,2L,1L))

# 数据预览
data
#      ID TEST Q1 Q2 Q3
# 1 15262  Pre  2  3  4
# 2 17382  Pre  5  4  3
# 3 14892  Pre  3  5  3
# 4 15262 Post  3  3  2
# 5 17382 Post  2  4  2
# 6 14892 Post  4  5  1

尝试过的代码

# 尝试1
final_data<- data %>% 
  pivot_longer(cols= starts_with('Q')) %>% 
  pivot_wider(names_from = Test, values_from = value) %>% 
  unnest()

# 尝试2
final_data2<- data %>% 
  pivot_longer(-Test,-ID) %>% 
  pivot_wider(names_from = Test, values_from = value) %>% 
  unnest()

正确解决方案

核心是在转置全程将ID作为分组依据,避免丢失关联关系:

  • 第一步用pivot_longer把Q1-Q3转为长格式,同时保留ID和TEST列;
  • 第二步用pivot_wider以ID和问题名称为标识,将Pre/Post转为独立列。
library(dplyr)
library(tidyr)

final_data <- data %>%
  # 将Q开头的列转为长格式,指定问题列和值列的名称
  pivot_longer(cols = starts_with("Q"), 
               names_to = "Question", 
               values_to = "Value") %>%
  # 以ID和Question为分组维度,将TEST的不同取值转为列
  pivot_wider(id_cols = c(ID, Question), 
              names_from = TEST, 
              values_from = Value)

输出结果

final_data
#      ID Question Pre Post
# 1 15262       Q1   2    3
# 2 15262       Q2   3    3
# 3 15262       Q3   4    2
# 4 17382       Q1   5    2
# 5 17382       Q2   4    4
# 6 17382       Q3   3    2
# 7 14892       Q1   3    4
# 8 14892       Q2   5    5
# 9 14892       Q3   3    1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:52