r语言 - 将一个数字向量分成不同的连续数字



给定一个向量作为c(1,3,4,5,7,8,9,10),如何将其分成不同的树干,将连续的树干作为一个簇,期望的结果是c(1),c(3,4,5),c(7,8,9,10)?

规则:将数字分成不同的簇;每个簇只包含连续的有序数。

集群和每个集群中有多少个号码发布如下,但是如何使用trunk分割和获得结果?还是其他方法?如有任何帮助,不胜感激。

library(tidyverse)
num <- c(1,3,4,5,7,8,9,10)
num_seq <- seq(min(num), max(num))
chunks <- num_seq %in% num %>% 
as.character() %>% 
paste(collapse = " ") %>% 
str_split("FALSE") %>%
unlist() %>% 
as.list() %>% 
map(.f = ~str_count(., "TRUE"))
[[1]]
[1] 1
[[2]]
[1] 3
[[3]]
[1] 4

base解决方案:您可以使用diff()+cumsum()来确定序列的连续位置。

num <- c(1,3,4,5,7,8,9,10)
split(num, cumsum(c(TRUE, diff(num) != 1)))
# $`1`
# [1] 1
# 
# $`2`
# [1] 3 4 5
# 
# $`3`
# [1]  7  8  9 10

这个data.table解决方案有效,但通常不如Darren的基础split解决方案快:

library(data.table)
num <- c(1,3,4,5,7,8,9,10)
data.table(num)[, .(chunks = .(num)), cumsum(num - shift(num, fill = -Inf) > 1)]$chunks
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 3 4 5
#> 
#> [[3]]
#> [1]  7  8  9 10

最新更新