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

如何将多列数据转换为宽格式?R语言数据重塑求助

将4×3 DataFrame转换为指定宽格式的解决方案

你的需求核心是把以day为行标识、hours/cost为指标列的DataFrame,转换为以hours/cost为行标识、day为列的宽格式。直接用pivot_wider失败是因为原始数据结构不符合转宽的前置要求,需要先把数据"拉长"再转宽。

方法一:使用tidyverse(推荐)

借助pivot_longer先将指标列合并为长格式,再用pivot_wider转成目标宽格式:

library(tidyverse)

# 原始数据
day <- c("mon", "tues", "wed", "thur")
hours <- c(2, 4, 6, 8)
cost <- c(100, 200, 300, 400)
df <- data.frame(day, hours, cost)

# 转换流程
df1 <- df %>%
  # 把hours和cost列拆分为type(指标类型)和value(对应数值)
  pivot_longer(cols = c(hours, cost), names_to = "type", values_to = "value") %>%
  # 把day的不同取值转为列,value填充对应单元格
  pivot_wider(names_from = day, values_from = value)

# 输出结果
df1

运行后得到的df1完全匹配你的目标格式:

# A tibble: 2 × 5
  type    mon  tues   wed  thur
  <chr> <dbl> <dbl> <dbl> <dbl>
1 hours     2     4     6     8
2 cost    100   200   300   400

方法二:Base R 实现

如果不想加载第三方包,可以用转置+列名调整的方式:

# 原始数据
day <- c("mon", "tues", "wed", "thur")
hours <- c(2, 4, 6, 8)
cost <- c(100, 200, 300, 400)
df <- data.frame(day, hours, cost)

# 转置除day列外的部分,设置列名为day的值
df_base <- as.data.frame(t(df[-1]))
colnames(df_base) <- df$day

# 添加type列并调整列顺序
df_base$type <- rownames(df_base)
rownames(df_base) <- NULL
df_base <- df_base[, c("type", df$day)]

# 输出结果
df_base

输出结果与tidyverse方法一致:

type mon tues wed thur
hours hours   2    4   6    8
cost   cost 100  200 300  400

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:22:58