查找数字运行范围

时间:2013-08-16 15:19:13

标签: r

我试图在数据框中找到多年的运行(理想情况下使用plyr)

我想从中得到:

require(plyr)

dat<-data.frame(
  name=c(rep("A", 11), rep("B", 11)),
  year=c(2000:2010, 2000:2005, 2007:2011)
  )

对此:

out<-data.frame(
  name=c("A", "B", "B"),
  range=c("2000-2010", "2000-2005", "2007-2011"))

很容易确定每个小组是否连续几年:

ddply(dat, .(name), summarise,
      continuous=(max(year)-min(year))+1==length(year))

如何将组“B”分解为两个范围?

任何想法或策略都会非常感激。

由于

2 个答案:

答案 0 :(得分:7)

无论您使用“plyr”或基础R中的函数,您都需要先建立一些组。检测组中变化的一种方法是,因为您的年份是连续的,所以查找diff不等于1的位置。diff创建一个长度比输入向量小1的向量,所以我们将用“1”初始化,然后取结果的cumsum

将一口解释付诸实践,你可以尝试这样的事情:

dat$id2 <- cumsum(c(1, diff(dat$year) != 1))

从这里开始,您可以使用aggregate或您喜欢的分组功能来获取您正在寻找的输出。

aggregate(year ~ name + id2, dat, function(x) paste(min(x), max(x), sep = "-"))
#   name id2      year
# 1    A   1 2000-2010
# 2    B   2 2000-2005
# 3    B   3 2007-2011

要将rangeaggregate一起使用,您需要将sep更改为collapse,如下所示:

aggregate(year ~ name + id2, dat, function(x) paste(range(x), collapse = "-"))

答案 1 :(得分:2)

嘟嘟我自己的号角,cgwtools::seqle可以用来识别分裂。在*apply元素上运行循环或names,对于每种情况,

foo <- seqle(dat$year, incr=1)

然后length(foo$lengths)将为您提供组数,并且可以从foo$values轻松重建年份范围。

yeargroups <-  sapply(length(foo$lengths), function(x) c(foo$values[x],(foo$values[x]+foo$lengths[x]-1)))

如果某人有不同参数或所需细分的相似情况,请提出此建议。