Есть ли функция R для заказа по символу или коэффициенту интервалов? - PullRequest
0 голосов
/ 29 мая 2019

После нескольких функций я получаю таблицу, в которой есть упорядоченные символы, некоторые из которых начинаются с "(" или "[", за которыми следуют цифры. (Интервалы, идущие от разреза (x) в данных)

То, чего я хочу добиться, - это порядок по начальному значению инверсий, чтобы (100,124] не предшествовало редактированию (70,100] (см. Пример): порядок столбца1 (класса) должен оставаться таким, как есть.

хорошо, я попытался сделать это с помощью order и setorder из data.table, но пока не получилось. Я думаю, мне нужно разделить столбец с помощью strsplit, а затем упорядочить по первому элементу, но это не может быть "лучшее "решение

test <- data.frame(class = c("class1",   "class1",   "class1",   "class1",   "class2", "class2", "class2", "class2", "class2", "class2", "class2", "class2", "class2"),
                   attr = c("1","2","4","5","(100,124]", "(124,180]" ,"(180,Inf]", "(37,50]" ,  "(5,37]"  ,  "(50,56]"  , "(56,70]"  ,"(70,100]"  ,"[0,5]" ),
                  value = c(415.14,115.13,422.52,37.07,167.40,135.04,67.01,280.03,81.18,237.83,285.62,302.63,3.37))

цель:

class   attr    value
class1  1   415.14
class1  2   115.13
class1  4   422.52
class1  5   37.07
class2  [0,5]   3.37
class2  (5,37]  81.18
class2  (37,50] 280.03
class2  (50,56] 237.83
class2  (56,70] 285.62
class2  (70,100]    302.63
class2  (100,124]   167.40
class2  (124,180]   135.04
class2  (180,Inf]   67.01

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Опция с tidyverse

library(tidyverse)
test %>% 
   arrange(class, as.numeric(str_extract(attr, "\\d+")))
#  class      attr  value
#1  class1         1 415.14
#2  class1         2 115.13
#3  class1         4 422.52
#4  class1         5  37.07
#5  class2     [0,5]   3.37
#6  class2    (5,37]  81.18
#7  class2   (37,50] 280.03
#8  class2   (50,56] 237.83
#9  class2   (56,70] 285.62
#10 class2  (70,100] 302.63
#11 class2 (100,124] 167.40
#12 class2 (124,180] 135.04
#13 class2 (180,Inf]  67.01

ПРИМЕЧАНИЕ: не было заданного семени

2 голосов
/ 29 мая 2019

1) base R Заменить запятую и все после нее, а также любые нецифровые символы пустой строкой. Преобразуйте это в числовое и вычислите индексы, которые бы упорядочили его, o. Наконец, индекс test от o.

o <- with(test, order(class, as.numeric(gsub(",.*|\\D", "", attr))))
test[o, ]

дает:

    class      attr     value
1  class1         1  977.0947
2  class1         2  299.9418
3  class1         4 1398.7519
4  class1         5  170.8434
13 class2     [0,5]  299.1390
9  class2    (5,37]  326.5092
8  class2   (37,50]  923.6778
10 class2   (50,56]  734.9950
11 class2   (56,70]  820.7536
12 class2  (70,100]  779.0926
5  class2 (100,124]  308.5136
6  class2 (124,180]  234.6386
7  class2 (180,Inf]  100.1264

1a) Этот вариант также будет работать. Он соответствует необязательной начальной нецифровой цифре, за которой следуют цифры, за которыми следует что-нибудь еще, и заменяет все это только цифрами. Затем это продолжается, как указано выше.

o <- with(test, order(class, as.numeric(gsub("^\\D?(\\d+).*", "\\1", attr))))
test[o, ]

2) dplyr

Вышесказанное также можно сделать с помощью dplyr arrange, например:

library(dplyr) 

test %>% arrange(class, attr %>% gsub(",.*|\\D", "", .) %>% as.numeric)

2a) Вариант заключается в удалении (/ [и запятой и т. Д. Частей в отдельных подзадачах:

test %>% 
  arrange(class, attr %>% 
                   sub("^\\D", "", .) %>%
                   sub(",.*", "", .) %>%
                    as.numeric)
0 голосов
/ 29 мая 2019

stringi альтернатива, использующая ту же логику, что и @G. Решение Гротендика. Извлекает первую последовательность цифр в столбце attr:

o2 <- order(test$class, as.numeric(stringi::stri_extract_first_regex(test$attr, "\\d+")))
test[o2, ]

    class      attr     value
1  class1         1  977.0947
2  class1         2  299.9418
3  class1         4 1398.7519
4  class1         5  170.8434
13 class2     [0,5]  299.1390
9  class2    (5,37]  326.5092
8  class2   (37,50]  923.6778
10 class2   (50,56]  734.9950
11 class2   (56,70]  820.7536
12 class2  (70,100]  779.0926
5  class2 (100,124]  308.5136
6  class2 (124,180]  234.6386
7  class2 (180,Inf]  100.1264
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...