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

如何用tidyverse在R中基于双变量实现数据框宽表转换

使用tidyverse将长表转换为指定顺序的宽表

你可以通过tidyr::pivot_wider结合列顺序调整来实现需求,具体步骤如下:

步骤1:加载tidyverse包

library(tidyverse)

步骤2:定义目标列的顺序

根据需求,我们需要先排列Bad对应的指定年份,再是Mediocre,最后是Good。先构造出符合要求的列名向量:

# 指定Favor的优先级和目标年份
favor_order <- c("Bad", "Mediocre", "Good")
year_order <- c(1998, 1999, 2001, 2002)

# 生成目标列名,按Favor顺序 + 年份顺序排列
target_cols <- crossing(Favor = favor_order, Year = year_order) %>%
  mutate(col_name = str_c(Favor, Year, sep = "-")) %>%
  pull(col_name)

步骤3:转换宽表并调整列顺序

使用pivot_wider转宽,再用select确保列的顺序符合要求:

wide_data <- data %>%
  pivot_wider(
    id_cols = Category,  # 保留作为行标识的列
    names_from = c(Favor, Year),  # 用来生成宽表列名的字段
    values_from = Percentage,  # 填充宽表单元格的数值字段
    names_glue = "{Favor}-{Year}"  # 自定义列名格式
  ) %>%
  select(Category, all_of(target_cols))  # 按目标顺序重新排列列

说明:

  • names_glue参数用来将Favor和Year拼接成Bad-1998这样的列名,完全匹配你的需求。
  • select(Category, all_of(target_cols))确保后续列严格按照Bad→Mediocre→Good的顺序,每个类别下按1998、1999、2001、2002排列。
  • 如果你的原始数据中存在其他年份或Favor类别,上述代码会自动过滤掉(因为target_cols只包含指定的组合),如果需要保留所有组合,只需调整favor_order和year_order为数据中的所有唯一值即可。

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:09:51