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

