Комплексная сортировка по одной колонке в R - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь отсортировать фрейм данных по кодам, содержащимся в одном столбце.

Лог c за этим кодом:

S / число / число / число / ди git (например, S120B). Числа не всегда 3 (например, S10K), и буквы не всегда присутствуют (например, S2).

Первый код - S1, и список продолжается до S999, где он превращается в S1A. Затем он переходит к S999A, затем переходит к S1B и так далее.

Кроме того, внутри есть также совершенно разные коды, такие как W23, E100 и т. Д. c, которые должны go вместе.

Как я могу упорядочить фрейм данных в соответствии с этим довольно схема размещения больных?

MWE: codes <- c(S1, S20D, S550C, S88A, S420K, E44, W22)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Следуя вашим указаниям, это настраиваемая функция:

codes <- c("S1", "S20D", "E44", "S550C", "S88A", "S420K", "W22")
complex_order <- function(codes) {
  # Create empty order vector
  final_order <- rep(NA,length(codes))
  # First into account codes that do not match the S convention
  not_in_convention <- !tolower(substr(codes,1,1)) == "s"
  final_order[(length(codes)-sum(not_in_convention)+1):length(codes)] <- which(not_in_convention)

  # Then check the ones that has a letter at the end
  letter_at_end <- tolower(substr(codes,nchar(codes),nchar(codes))) %in% letters & !not_in_convention
  for (idx in which(letter_at_end)) {
    lettr <- tolower(substr(codes[idx],nchar(codes[idx]),nchar(codes[idx])))
    lettr_value <- which(lettr == letters) * 1000 # Every letter means 1000 positions ahead
    codes[idx] <- paste0("S",as.character(lettr_value))
  }

  # Now that we have all in the same code, order the values
  values <- as.numeric(tolower(substr(codes[!not_in_convention],2,nchar(codes[!not_in_convention]))))
  final_order[order(values)] <- which(!not_in_convention) 
  final_order
}
codes[complex_order(codes)]
[1] "S1"    "S88A"  "S550C" "S20D"  "S420K" "E44"   "W22" 

Надеюсь, это поможет!

0 голосов
/ 17 февраля 2020

1.Создать минимальный воспроизводимый пример ;)

mre <- data.frame(ID = c("S1", "S20D", "S550C", "S88A", "S420K", "E44", "W22"),
                stringsAsFactors = FALSE)

Теперь я не уверен, что вы подразумеваете под:

Кроме того, есть также коды внутри Thare совершенно разные, как W23, E100 и т. д. c, которые должны go вместе.

Если вы имеете в виду, что "W23" должен читаться, сортируется совершенно иначе, чем "S999 «нам нужна дополнительная информация о том, как различать guish между этими двумя случаями. В противном случае это должно работать:

2. Алгоритм сортировки по алфавиту:

library(dplyr)
mre %>% 
  arrange(ID)


     ID
1   E44
2    S1
3  S20D
4 S420K
5 S550C
6  S88A
7   W22

или с использованием только базового R:

mre[order(mre$ID),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...