R语言reshape函数列排序异常:时间变量未按数值顺序排列求助
R语言reshape函数转宽表时列顺序不符合数值排序的问题
我尝试用R语言的reshape函数将长表转为宽表,用于拆分的Time变量是数值型,但生成的列顺序为2,0.5,4,6,8,0,24...168,而非预期的0.0,0.5,2.0,4.0,6.0,8.0,24.0...168.0。试过将times参数设置为sort(unique(G2$Time)),也用na.omit处理过Time和Sugar变量,但都无法解决问题。
原数据
>G2 Animal Sex Time Sugar 1 2001 M 2.0 5880 2 2001 M 0.5 95 3 2001 M 4.0 25100 4 2001 M 6.0 68500 5 2001 M 8.0 110000 6 2001 M 0.0 NA 7 2001 M 24.0 336000 8 2001 M 48.0 476000 9 2001 M 72.0 413000 10 2001 M 96.0 368000 11 2001 M 120.0 332000 12 2001 M 144.0 282000 13 2001 M 168.0 271000 14 2002 M 2.0 13200 15 2002 M 0.5 356 16 2002 M 4.0 55700 17 2002 M 6.0 121000 18 2002 M 8.0 216000 19 2002 M 0.0 NA 20 2002 M 24.0 529000 21 2002 M 48.0 554000 22 2002 M 72.0 468000 23 2002 M 96.0 408000 24 2002 M 120.0 354000 25 2002 M 144.0 348000 26 2002 M 168.0 290000 27 2003 M 2.0 20500 28 2003 M 0.5 1190 29 2003 M 4.0 43800 30 2003 M 6.0 90500 31 2003 M 8.0 142000 32 2003 M 0.0 NA 33 2003 M 24.0 401000 34 2003 M 48.0 485000 35 2003 M 72.0 393000 36 2003 M 96.0 386000 37 2003 M 120.0 335000 38 2003 M 144.0 289000 39 2003 M 168.0 247000 40 2501 F 2.0 6630 41 2501 F 0.5 305 42 2501 F 4.0 28900 43 2501 F 6.0 67300 44 2501 F 8.0 138000 45 2501 F 0.0 NA 46 2501 F 24.0 395000 47 2501 F 48.0 474000 48 2501 F 72.0 390000 49 2501 F 96.0 330000 50 2501 F 120.0 318000 51 2501 F 144.0 258000 52 2501 F 168.0 238000 53 2502 F 2.0 2140 54 2502 F 0.5 NA 55 2502 F 4.0 15700 56 2502 F 6.0 69200 57 2502 F 8.0 125000 58 2502 F 0.0 NA 59 2502 F 24.0 478000 60 2502 F 48.0 500000 61 2502 F 72.0 471000 62 2502 F 96.0 407000 63 2502 F 120.0 414000 64 2502 F 144.0 352000 65 2502 F 168.0 462000 66 2503 F 2.0 32400 67 2503 F 0.5 6290 68 2503 F 4.0 78800 69 2503 F 6.0 119000 70 2503 F 8.0 160000 71 2503 F 0.0 NA 72 2503 F 24.0 328000 73 2503 F 48.0 463000 74 2503 F 72.0 429000 75 2503 F 96.0 381000 76 2503 F 120.0 389000 77 2503 F 144.0 339000 78 2503 F 168.0 327000
执行的代码
G2r = reshape(G2, direction = "wide", idvar = c("Animal","Sex"), times = Time, timevar = "Time" )
得到的结果
> head(G2r) Animal Sex Sugar.2 Sugar.0.5 Sugar.4 Sugar.6 Sugar.8 Sugar.24 Sugar.48 Sugar.72 Sugar.96 Sugar.120 Sugar.144 Sugar.168 1 2001 M 5880 95 25100 68500 110000 336000 476000 413000 368000 332000 282000 271000 13 2002 M 13200 356 55700 121000 216000 529000 554000 468000 408000 354000 348000 290000 25 2003 M 20500 1190 43800 90500 142000 401000 485000 393000 386000 335000 289000 247000 37 2501 F 6630 305 28900 67300 138000 395000 474000 390000 330000 318000 258000 238000 49 2502 F 2140 NA 15700 69200 125000 478000 500000 471000 407000 414000 352000 462000 60 2503 F 32400 6290 78800 119000 160000 328000 463000 429000 381000 389000 339000 327000
解决方案
方法1:转宽后手动调整列顺序
base包的reshape函数生成列时,会按照Time在原数据中首次出现的顺序排列,而非数值排序。可以在转宽后,根据排序后的时间点重新调整列顺序:
# 获取排序后的时间点 sorted_times <- sort(unique(G2$Time)) # 生成对应的列名 sorted_cols <- paste0("Sugar.", sorted_times) # 重新排列数据框的列 G2r_sorted <- G2r[, c("Animal", "Sex", sorted_cols)]
方法2:使用tidyr包的pivot_wider(推荐)
tidyr是tidyverse生态中的包,pivot_wider是更现代的长转宽工具,支持直接按数值顺序排列列,只需设置names_sort=TRUE参数:
library(tidyr) library(dplyr) G2r_tidy <- G2 %>% pivot_wider( id_cols = c(Animal, Sex), names_from = Time, values_from = Sugar, names_prefix = "Sugar.", names_sort = TRUE # 按时间点的数值大小排序列 )
内容的提问来源于stack exchange,提问作者Gabriela Toomer
相关产品推荐
相关产品推荐

