У меня проблема с некоторыми R-кодами с точки зрения спортивных данных за несколько лет, которые не находятся в очень логичном порядке. У меня есть набор данных с 42 переменными и почти 80 000 случаев, один из которых перефразирован ниже:

dat <- c(2020, 2020, 2020, 2020, 2020, 2020, 2020)
r<- c("QF", "R1", "R15", "R2", "R25", "R3", "SF")
data <- data.frame(dat, r)

Очевидно, что в каждом ящике будет одна из круглых деталей, а не все из них, и не только 26 ящиков.

Проблема в том, что вместо того, чтобы заказывать его в указанном выше порядке R1-R25, за которым следуют QF, SF и GF, он упорядочивается в виде GF, QF, R1, R10-R19, R2, R21-R25, R3- R9, SF, очевидно, из-за порядкового номера первой цифры после R и буквенного порядка каждой вещи.

Я хочу, чтобы это выглядело так, но я не могу вручную просмотреть 80 000 дел, как это:

dat <- c(2020, 2020, 2020, 2020, 2020, 2020, 2020)
r <- c("R1", "R2", "R3", "R15", "R25", "R3", "QF", "SF")
data <- data.frame(dat, r)

Благодарность :)

1
user1249891235907 9 Окт 2021 в 03:03

2 ответа

Лучший ответ

Вот решение tidyverse:

library(tidyverse)

data %>% 
  mutate(r = str_sort(r, numeric = T))

Редактировать:

Чтобы arrange как "R, Q, S", вы можете подставить свою переменную r и применить пользовательскую сортировку, используя arrange и match:

data %>% 
  mutate(r = str_sort(r, numeric = T)) %>% 
  arrange(match(str_sub(r,1,1), c("R", "Q", "S"))) 

Это дает нам:

   dat   r
1 2020  R1
2 2020  R2
3 2020  R3
4 2020 R15
5 2020 R25
6 2020  QF
7 2020  SF
0
Matt 9 Окт 2021 в 01:58

Поскольку вы хотите, чтобы в конце были "QF" и "SF", одним из вариантов было бы извлечь число из столбца r и order их. "QF" и "SF" не имеют числовых значений, поэтому они вернут NA и будут упорядочены последними.

result <- data[order(as.numeric(stringr::str_extract(data$r, '\\d+'))), ]

#   dat   r
#2 2020  R1
#4 2020  R2
#6 2020  R3
#3 2020 R15
#5 2020 R25
#1 2020  QF
#7 2020  SF
1
Ronak Shah 9 Окт 2021 в 01:25