R 仅订购一个因子级别(或列,如果之后)以影响从长到宽的订单(使用价差)

R Order only one factor level (or column if after) to affect order long to wide (using spread)

将我的数据集从长数据集更改为宽数据集后出现问题(使用 spread,来自 Result_Type 列上的 tidyr 库)。我有以下示例 df:

Group<-c("A","A","A","B","B","B","C","C","C","D", "D")
Result_Type<-c("Final.Result", "Verification","Test", "Verification","Final.Result","Fast",
               "Verification","Fast", "Final.Result", "Test", "Final.Result")
Result<-c(7,1,8,7,"NA",9,10,12,17,50,11)
df<-data.frame(Group, Result_Type, Result)

df
   Group  Result_Type Result
1      A Final.Result      7
2      A Verification      1
3      A         Test      8
4      B Verification      7
5      B Final.Result     NA
6      B         Fast      9
7      C Verification     10
8      C         Fast     12
9      C Final.Result     17
10     D         Test     50
11     D Final.Result     11

Result_type 列中,有许多可能的结果类型,在某些数据集中,我有 Result_Type 的结果类型,这些类型不会出现在其他数据集中。但是,一个级别:Final.Result确实出现在每个数据集中。

此外:这是示例数据,但实际数据有许多不同的列,并且由于这些在我使用的数据集中不同,我使用了 spread(来自 tidyr 库)所以我不必给出除我的目标列之外的任何特定列名称。

library("tidyr")
df_spread<-spread(df, key = Result_Type, value = Result)

  Group Fast Final.Result Test Verification
1     A <NA>            7    8            1
2     B    9           NA <NA>            7
3     C   12           17 <NA>           10
4     D <NA>           11   50         <NA>

我想要的是一旦我将数据集从长转换为宽,Final.Result 是第一列,其余列的排列方式无关紧要,所以我希望它像这样(不调用传播的其他列的任何名称,或使用订单索引号):

  Group Final.Result Fast Test Verification
1     A            7 <NA>    8            1
2     B           NA    9 <NA>            7
3     C           17   12 <NA>           10
4     D           11 <NA>   50         <NA>

我看到一些答案表明您可以反转展开列的顺序,或者关闭展开的顺序,但这并不能确保 Final.Result 始终是 spread 关卡。

我希望我说清楚了,解释起来有点复杂。如果有人需要额外的信息,我会很乐意解释更多!

一个选项是重构 Result_Type 以将 final.result 作为第一个:

df$Result_Type<-factor(df$Result_Type,levels=c("Final.Result",as.character(unique(df$Result_Type)[!unique(df$Result_Type)=="Final.Result"])))

spread(df, key = Result_Type, value = Result)
  Group Final.Result Verification Test Fast
1     A            7            1    8   NA
2     B           NA            7   NA    9
3     C           17           10   NA   12
4     D           11           NA   50   NA

如果您愿意,可以利用这个机会对其余的列进行任意排序。

spread 按照 key 列的因子水平的顺序创建列。在 tidyverse 中,forcats::fct_relevel 是一个用于重新排列因子水平的便利函数。默认是您指定的级别将移到前面。

library(dplyr)
library(tidyr)

...

levels(df$Result_Type)
#> [1] "Fast"         "Final.Result" "Test"         "Verification"

调用 fct_relevel 会将 "Final.Result" 设置为第一级,其余级别保持原先的顺序。

reordered <- df %>%
  mutate(Result_Type = forcats::fct_relevel(Result_Type, "Final.Result"))

levels(reordered$Result_Type)
#> [1] "Final.Result" "Fast"         "Test"         "Verification"

将其添加到您的管道中会将 Final.Result 作为传播后的第一列。

df %>%
  mutate(Result_Type = forcats::fct_relevel(Result_Type, "Final.Result")) %>%
  spread(key = Result_Type, value = Result)
#>   Group Final.Result Fast Test Verification
#> 1     A            7 <NA>    8            1
#> 2     B           NA    9 <NA>            7
#> 3     C           17   12 <NA>           10
#> 4     D           11 <NA>   50         <NA>

reprex package (v0.2.1)

创建于 2018-12-14