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

R语言长格式dataframe转换为指定宽格式的方法咨询

R长格式数据转宽格式实现方案

此前转换失败的核心原因是仅使用Date、Name作为分组标识,漏掉了Name 2字段,该字段也是每个分组的唯一标识字段,需将其加入分组列再做转换即可实现需求。

方案1:使用tidyverse包的pivot_wider实现

# 加载依赖包
library(tidyverse)

# 构造示例数据,实际使用时替换为你自己的数据集即可
df <- tibble(
  Date = rep(c("2018-06-30", "2018-07-30"), each = 3),
  Name = rep("Germany", 6),
  `Name 2` = rep("Italy", 6),
  Variable = rep(c("Benchmark", "Active", "Port"), 2),
  Value = c(30,50,20,50,20,30)
)

# 长转宽+字段调整
df_wide <- df %>%
  # 指定三个分组唯一标识列
  pivot_wider(id_cols = c(Date, Name, `Name 2`),
              names_from = Variable,
              values_from = Value) %>%
  # 按需求将Benchmark重命名为Bench
  rename(Bench = Benchmark) %>%
  # 调整为你需要的列顺序
  select(Date, Name, `Name 2`, Port, Bench, Active)

如果你的数据集存在同一分组下同一个Variable对应多个Value的情况,可在pivot_wider中添加values_fn参数指定聚合规则,比如values_fn = mean取均值,避免生成列表列。

方案2:使用基础R的reshape函数实现

无需安装额外依赖包,用R原生函数即可完成转换:

# 长转宽
df_wide <- reshape(df, 
                   idvar = c("Date", "Name", "Name 2"),
                   timevar = "Variable",
                   direction = "wide")
# 清理默认生成的列名
colnames(df_wide) <- gsub("Value.", "", colnames(df_wide))
# 按需求重命名Benchmark为Bench
colnames(df_wide)[colnames(df_wide) == "Benchmark"] <- "Bench"
# 调整为你需要的列顺序
df_wide <- df_wide[,c("Date", "Name", "Name 2", "Port", "Bench", "Active")]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:48:03