Сортировать числа, разделенные двоеточиями, используя R - PullRequest
0 голосов
/ 21 марта 2020

У меня тот же вопрос, что и здесь, но с использованием R:

Сортировка чисел с помощью двоеточий

У меня есть фрейм данных A с таким столбцом:

1:5
11:36
2:1
2:14
2:8

Я бы хотел отсортировать А по этому столбцу следующим образом:

1:5
2:1
2:8
2:14
11:36

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Мы можем separate данные в разные столбцы, arrange данные по всем столбцам и объединять их снова.

library(dplyr)
library(tidyr)

df %>%
  separate(V1, into = c("A", "B"), sep = ":", convert = TRUE) %>%
  arrange_all() %>%
  unite(A, A, B, sep = ":")

#      A
#1   1:5
#2   2:1
#3   2:8
#4  2:14
#5 11:36

данные

df <- structure(list(V1 = c("1:5", "11:36", "2:1", "2:14", "2:8")), 
row.names = c(NA, -5L), class = "data.frame")
1 голос
/ 21 марта 2020

Вот базовое решение R, использующее order + gsub, то есть

r <- v[order(as.numeric(gsub(":.*","",v)),
             as.numeric(gsub(".*:","",v)))]

, такое что

> r
[1] "1:5"   "2:1"   "2:8"   "2:14"  "11:36"
1 голос
/ 21 марта 2020

1) gtools mixedsort и mixedorder в gtools могут сделать это. Мы покажем, как это сделать для вектора v и целого фрейма данных DF, в котором могут быть дополнительные столбцы, которые необходимо переместить вместе со столбцом v. (Тестовые данные воспроизводимо определены в примечании в конце. Если столбец v в DF был фактором, а не символом, используйте вместо DF $ v символ as.character (DF $ v).

library(gtools)

mixedsort(v)
## [1] "1:5"   "2:1"   "2:8"   "2:14"  "11:36"

DF[mixedorder(DF$v), ]
##       v x
## 1   1:5 1
## 3   2:1 3
## 5   2:8 5
## 4  2:14 4
## 2 11:36 2

2) База R Эта альтернатива немного длиннее, но использует только базу R. Она дает те же ответы, что и (1). Комментарий о факторах в (1) также применим и здесь.

o <- do.call("order", read.table(text = v, sep = ":"))
v[o]

o <- do.call("order", read.table(text = DF$v, sep = ":"))
DF[o, ]

Примечание

Используемые данные испытаний

v <- c("1:5", "11:36", "2:1", "2:14", "2:8")
DF <- data.frame(v, x = seq_along(v), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...