如何在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
相关产品推荐
相关产品推荐

