R Порядок только одного факторного уровня (или столбца, если после), чтобы повлиять на порядок от длинного до широкого (с использованием спреда) - PullRequest
0 голосов
/ 14 декабря 2018

У меня возникла проблема после изменения набора данных с длинного на широкий (с использованием spread из библиотеки tidyr в столбце Result_Type).У меня есть следующий пример 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.

Надеюсь, яЯ проясняю, это немного сложно объяснить.Если кому-то понадобится дополнительная информация, я с удовольствием объясню подробнее!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

spread создает столбцы в порядке уровней факторов столбца key.В пределах направления forcats::fct_relevel - это удобная функция для изменения уровней коэффициентов.По умолчанию указанные вами уровни будут перемещены на передний план.

library(dplyr)
library(tidyr)

...

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

При вызове fct_relevel в качестве первого уровня будет "Final.Result", а остальные уровни останутся на прежнем уровне.order.

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>

Создано в 2018-12-14 представьте пакет (v0.2.1)

0 голосов
/ 14 декабря 2018

Один из вариантов заключается в рефакторинге 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

Если вы хотите, вы можете использовать эту возможность для сортировки остальных столбцов в зависимости от того, каким образомты хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...