如何将长格式DataFrame转为单行宽格式?已尝试pivot_wider未成功
问题
需要将长格式数据long_data转换为指定的单行宽格式DataFrame,尝试了以下代码但未成功:
pivot_wider(long_data, names_from = c(DV, time),values_from = c(score, task_type, mot), names_glue = "{.value}_{DV}_T{time}")
long_data数据定义:
library(tidyverse) m=" class sub order time DV score task_type mot 1 1 s-c 1 ac 1 simple 1.5 1 1 s-c 1 bc 2 simple 1.5 1 1 s-c 2 ac 3 complex 0.2 1 1 s-c 2 bc 4 complex 0.2 " long_data = read.table(text = m, header = TRUE)
期望输出:
class sub order DV_ac_T1 DV_ac_T2 DV_bc_T1 DV_bc_T2 task_type_T1 task_type_T2 mot_T1 mot_T2 1 1 s-c 1 3 2 4 simple complex 1.5 0.2
解决方案
原代码失败的原因是:score需要结合DV和time生成列名,而task_type、mot仅需结合time(同一时间下这两个字段的值是重复的),无法用统一的names_glue规则处理所有字段。可以分两步处理后合并:
- 处理
score字段,生成带DV标识的宽格式列:
score_wide <- long_data %>% select(class, sub, order, time, DV, score) %>% pivot_wider( names_from = c(DV, time), values_from = score, names_glue = "DV_{DV}_T{time}" )
- 处理
task_type和mot字段,生成仅带时间标识的宽格式列(先去重避免重复值):
meta_wide <- long_data %>% select(class, sub, order, time, task_type, mot) %>% distinct() %>% pivot_wider( names_from = time, values_from = c(task_type, mot), names_glue = "{.value}_T{time}" )
- 合并两个结果表:
desired_output <- score_wide %>% inner_join(meta_wide, by = c("class", "sub", "order"))
运行后即可得到目标格式的DataFrame。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

