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

如何将长格式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规则处理所有字段。可以分两步处理后合并:

  1. 处理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}"
  )
  1. 处理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}"
  )
  1. 合并两个结果表:
desired_output <- score_wide %>% 
  inner_join(meta_wide, by = c("class", "sub", "order"))

运行后即可得到目标格式的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:25:19