R仅订购一个因素级别(或列,如果在后面),以影响从长到宽的顺序(使用排列)

R仅订购一个因素级别(或列,如果在后面),以影响从长到宽的顺序(使用排列),r,sorting,tidyr,spread,R,Sorting,Tidyr,Spread,将数据集从长到宽(使用Result\u Type列上的tidyr库中的spread)更改后,我遇到了一个问题。我有以下示例: 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","Fas

将数据集从长到宽(使用
Result\u Type
列上的tidyr库中的
spread
)更改后,我遇到了一个问题。我有以下示例:

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
我想要的是,一旦我将数据集从长到宽进行转换,
Final.Result
是第一列,其余列的排列方式无关紧要,因此我希望它是这样的(不调用排列的其他列的任何名称,也不使用顺序索引号):

Group Final.结果快速测试验证
1 A 7 8 1
2 B NA 9 7
3 C 17 12 10
4 D 11 50
我看到一些答案表明,您可以颠倒排列列的顺序,或关闭排列顺序,但这不能确保
Final.Result
始终是
排列
级别的第一列


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

一个选项是重构
Result\u 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

df$Result\u Type
排列
列的因子级别顺序创建列。在tidyverse中,
forcats::fct_relevel
是一个方便的函数,用于重新排列因子级别。默认情况下,指定的标高将移到前面

库(dplyr)
图书馆(tidyr)
...
级别(df$结果类型)
#>[1]“快速”“最终结果”“测试”“验证”
调用
fct\u relevel
将把
“Final.Result”
作为第一个级别,将其余级别保持在先前的顺序

重新排序%
变异(Result\u Type=forcats::fct\u relevel(Result\u Type,“Final.Result”))
级别(重新排序的$Result\u类型)
#>[1]“最终结果”“快速”“测试”“验证”
将其添加到管道中会将
Final.Result
作为展开后的第一列

df%>%
突变(结果类型=forcats::fct\u relevel(结果类型,“Final.Result”))%>%
排列(键=结果类型,值=结果)
#>小组最终结果。快速测试验证
#>1 A 7 8 1
#>2 B NA 9 7
#>3 C 17 12 10
#>4 D 11 50

由(v0.2.1)于2018-12-14创建,抱歉,我也将编辑我的问题:从tidyr Library为什么不为订购添加一个额外步骤?比如
spread(df,key=Result\u Type,value=Result)%%>%select(Group,Final.Result,everything())
Yes-only Group实际上也是多个列,在不同的数据集中有不同的名称,像这样的东西还能用吗?啊,太好了,我不知道我能用这种方式,非常感谢:)!
  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>
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