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
将我的数据集从长数据集更改为宽数据集后出现问题(使用 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