Вы можете узнать строки, где разрывы последовательности, используя diff
и использовать его как переменную группировки.
df$group <- cumsum(c(TRUE, diff(df$Missing_Years) > 1))
aggregate(Missing_Years~cname+group, df, function(x) paste(range(x),collapse = "-"))
Или, используя dplyr
, мы можем сравнить значения, используя lag
.
library(dplyr)
df %>%
group_by(cname,grp = cumsum(Missing_Years-lag(Missing_Years,default = 0) > 1)) %>%
summarise(Missing_Years = paste(range(Missing_Years), collapse = "-")) %>%
select(-grp)
# cname Missing_Years
# <fct> <chr>
#1 Afghanistan 1960-1964
#2 Afghanistan 1997-2005
данные
df <- structure(list(Missing_Years = c(1960L, 1961L, 1962L, 1963L,
1964L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L,
2005L), cname = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L), .Label = "Afghanistan", class = "factor")), class =
"data.frame", row.names = c(NA,-14L))