Хобрук: Ваш путь к мастерству в программировании

R: Как сортировать размеры по удобочитаемости

У меня есть набор данных, которые я пытаюсь отсортировать по размеру, однако размер элементов сильно варьируется от ~ 140 КБ до ~ 130 ГБ, поэтому отображение в байтах вообще не очень легко читается. Я могу изменить входные данные, чтобы они имели удобочитаемые размеры, но когда я вывожу их в виде графика, они не упорядочены, как можно было бы ожидать. Как бы я отсортировал это по удобочитаемости?

Код:

library(ggplot2)

mydata <- read.csv("/path/to/test.csv")
restore.df = data.frame(
    Start = as.POSIXct(mydata$start),
    Size = mydata$size,
    Labels = gsub(" [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}","",mydata$start)
)

p <- ggplot(restore.df, aes(x=Start,y=Size)) + geom_point()
p + scale_x_date(date_labels = "%y-%m-%d", limits = as.Date('2018-06-14', "%y-%m-%d"), as.Date('2018-06-20', "%Y-%m-%d"))

png(filename="/path/to/test.png",width=1368,height=1060,units="px")
print(p)
dev.off()

Результат: результат

Сокращенный набор данных:

start,stop,time,size
"2018-06-14 17:30:05","2018-06-14 17:30:05",3.6,7.3G
"2018-06-14 17:33:47","2018-06-14 17:33:47",1.05,304M
"2018-06-14 17:35:07","2018-06-14 17:35:07",62.9666666666667,132G
"2018-06-14 23:33:51","2018-06-14 23:33:51",0,880K
"2018-06-14 23:34:13","2018-06-14 23:34:13",1.16666666666667,305M
"2018-06-17 01:34:56","2018-06-17 01:34:56",20.2666666666667,6.2G
"2018-06-17 01:56:13","2018-06-17 01:56:13",15.7833333333333,9.4G
"2018-06-22 17:34:33","2018-06-22 17:34:33",0,144K
24.07.2018

  • Вы можете использовать логарифмическую шкалу по оси Y вместо номинальных значений (K, M и G). 24.07.2018

Ответы:


1

Вот простой способ отсортировать строки размера, предполагая, что они всегда имеют длину 4 символа (как в приведенном примере).

Size <- c('7.3G', '304M', '132G', '880K', '305M', '6.2G', '9.4G', '144K')

s1 <- substr(a, 1, 3)
s2 <- substr(a, 4, 4)
ii <- order(chartr('KMG', '123', s2), as.numeric(s1), Size)
print(Size[ii])

# [1] "144K" "880K" "304M" "305M" "6.2G" "7.3G" "9.4G" "132G"

Функция order() обеспечивает порядок сортировки Size на основе порядка сортировки первого аргумента, а затем второго аргумента. Первый - это K, M или G, замененные на 1, 2 или 3, поэтому они сортируются по номерам. Второй — это числовое значение первых трех символов строки Size.

24.07.2018

2

Я не уверен, есть ли уже пакет, который преобразует это, но вы можете преобразовать размеры и упорядочить их вручную. Затем постройте и отрегулируйте метки оси Y по мере необходимости.

library(dplyr)
library(ggplot2)
d <- structure(list(start = c("2018-06-14 17:30:05", "2018-06-14 17:33:47", 
                              "2018-06-14 17:35:07", "2018-06-14 23:33:51", "2018-06-14 23:34:13", 
                              "2018-06-17 01:34:56", "2018-06-17 01:56:13", "2018-06-22 17:34:33"), 
                    stop = c("2018-06-14 17:30:05", "2018-06-14 17:33:47", "2018-06-14 17:35:07", 
                             "2018-06-14 23:33:51", "2018-06-14 23:34:13", "2018-06-17 01:34:56", 
                             "2018-06-17 01:56:13", "2018-06-22 17:34:33"), 
                    time = c(3.6, 1.05, 62.9666666666667, 0, 1.16666666666667, 20.2666666666667, 
                             15.7833333333333, 0), 
                    size = c("7.3G", "304M", "132G", "880K", "305M", "6.2G", "9.4G", "144K")), 
                    .Names = c("start", "stop", "time", "size"), class = "data.frame", row.names = c(NA, -8L))

## function to convert sizes
convert_size <- function(x){
  ## if all numbers
  if(grepl('^[0-9]{1,}$', x)) return(x)
  ## convert when not
  prefix <- substr(x, nchar(x), nchar(x))
  n <- substr(x, 1, nchar(x)-1)
  fct <- dplyr::case_when(
    prefix == 'K' ~ 1024,
    prefix == 'M' ~ 1024^2,
    prefix == 'G' ~ 1024^3,
    prefix == 'T' ~ 1024^4,
  )
  xx <- as.numeric(n)*fct
  return(xx)
}

d2 <- d %>% mutate(fsize = sapply(size, convert_size)) %>% arrange(fsize)

restore.df = data.frame(
  Start = as.POSIXct(d2$start),
  Size = d2$size,
  FSize = d2$fsize,
  Labels = gsub(" [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}","",d2$start)
)
print(restore.df)
#>                 Start Size        FSize     Labels
#> 1 2018-06-22 17:34:33 144K       147456 2018-06-22
#> 2 2018-06-14 23:33:51 880K       901120 2018-06-14
#> 3 2018-06-14 17:33:47 304M    318767104 2018-06-14
#> 4 2018-06-14 23:34:13 305M    319815680 2018-06-14
#> 5 2018-06-17 01:34:56 6.2G   6442450944 2018-06-17
#> 6 2018-06-14 17:30:05 7.3G   7516192768 2018-06-14
#> 7 2018-06-17 01:56:13 9.4G   9663676416 2018-06-17
#> 8 2018-06-14 17:35:07 132G 141733920768 2018-06-14

## plot
# adjust for breaks
bks <- c('100K','1M','100M','1G','10G','100G')
p <- ggplot(restore.df, aes(x=as.Date(Start),y=FSize)) + geom_point()
p + scale_x_date(date_labels = "%Y-%m-%d", limits = c(as.Date('2018-06-14', "%Y-%m-%d"), 
             as.Date('2018-06-20', "%Y-%m-%d"))) + 
  scale_y_log10(breaks = sapply(bks, convert_size), labels = bks)

#Created on 2018-07-24 by the [reprex package](http://reprex.tidyverse.org) (v0.2.0.9000).
24.07.2018
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..