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