如何将多列数据转换为宽格式?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
相关产品推荐
相关产品推荐

