R宽表转长表如何实现按观测交叉排序而非按变量分组排序
解决方案
你可以直接使用tidyverse生态下的pivot_longer()函数完成需求,该函数转换长格式时默认按保留的ID列(也就是你这里的Weekday)优先排序,输出完全符合你要的同一工作日下季度依次排列的效果,示例代码如下:
library(tidyverse) # 原始宽表数据 df <- data.frame( Weekday = c( "Mon", "Tues", "Wed", "Thurs", "Fri" ), Q1 = c( 9.9 , 4.9 , 8.8 , 12.2 , 12.2 ), Q2 = c( 5.4 , 9.7 , 11.1 , 10.2 , 8.1 ), Q3 = c( 8.8 , 7.9 , 10.2 , 9.2 , 7.9 ), Q4 = c( 6.9 , 5 , 9.3 , 9.7 , 5.6 ) ) # 转换为长格式 df_long <- df %>% pivot_longer( cols = -Weekday, # 除Weekday外所有列转换为长值 names_to = "Quarter", values_to = "Delay" )
如果你习惯使用reshape2包的melt()函数,也不需要更换工具,仅需在转换后加一步按Weekday排序的操作即可:
library(reshape2) df_melt <- melt(df, id.vars=c("Weekday"), variable.name="Quarter", value.name="Delay") # 按Weekday排序得到目标结果 df_melt_sorted <- df_melt[order(df_melt$Weekday), ]
注意事项
如果需要严格按照周一到周五的自然顺序排列,避免字符串按字母顺序排序导致的错位,可以提前将Weekday列设置为有序因子:
df$Weekday <- factor(df$Weekday, levels = c("Mon", "Tues", "Wed", "Thurs", "Fri"))
内容的提问来源于stack exchange,提问作者user15141497
相关产品推荐
相关产品推荐

