Как сгруппировать непрерывную переменную в диапазон r - PullRequest
1 голос
/ 17 апреля 2020

У меня есть пример набора данных:

Road Start End Cat 
1     0     50  a 
1     50    60  b
1     60    90  b
1     70    75  a
2     0     20  a
2     20    25  a
2     25    40  b

Попытка вывести следующее:

 Road Start End Cat
 1     0    50   a
 1     50   90   b
 1     70   75   a
 2     0    25   a
 2     25   40   b

Мой код не работает:

df %>% group_by(Road, cat)
   %>% summarise(
    min(Start),
    max(End)
)

Как можно Достигаю ли я желаемых результатов?

1 Ответ

1 голос
/ 17 апреля 2020

Мы можем использовать rleid из data.table, чтобы получить run-length-id-encoding для группировки, а затем выполнить summarise

library(dplyr)
library(data.table)
df %>%
    group_by(Road, grp = rleid(Cat)) %>%
    summarise(Cat = first(Cat), Start = min(Start), End = max(End)) %>%
    select(-grp)
# A tibble: 5 x 4
# Groups:   Road [2]
#   Road Cat   Start   End
#  <int> <chr> <int> <int>
#1     1 a         0    50
#2     1 b        50    90
#3     1 a        70    75
#4     2 a         0    25
#5     2 b        25    40

Или используя data.table методы

library(data.table)
setDT(df)[, .(Start = min(Start), End = max(End)), .(Road, Cat, grp = rleid(Cat))]

данные

df <- structure(list(Road = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), Start = c(0L, 
50L, 60L, 70L, 0L, 20L, 25L), End = c(50L, 60L, 90L, 75L, 20L, 
25L, 40L), Cat = c("a", "b", "b", "a", "a", "a", "b")), 
 class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...