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

