我试图在数据框中找到多年的运行(理想情况下使用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”分解为两个范围?
任何想法或策略都会非常感激。
由于
答案 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
要将range
与aggregate
一起使用,您需要将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)))
如果某人有不同参数或所需细分的相似情况,请提出此建议。