找到data.frame中连续出现的事件的最大计数的好方法是什么?

时间:2016-03-23 16:15:57

标签: r dplyr

例如,假设有一个data.frame

set.seed(1)
x = data.frame(foo=letters, bar=as.integer((rnorm(26) > 0.5)))

在此示例中,1的最大连续条纹发生在第18行和第22行(​​包括第18行和第22行)之间。我想知道的是,如果有一个更大的框架,是否有一个很好的方法来识别这样的地方?我通常使用表格dplyr并尝试使用特殊值cumprodcumsum,但这两种方法似乎都没有削减它。

2 个答案:

答案 0 :(得分:3)

这是另一种方式:

with(rle(x$bar), {
  w = which.max(lengths*(values==1))
  cumsum(c(1L,lengths))[w+0:1] - 0:1
})
# 18 22

工作原理:

我们希望values==1的运行时间最长。由于真/假在R中的乘法下映射到1/0,因此这是最大化lengths*(values==1)的运行。称之为w运行。

cumsum(c(1L,lengths))包含每次运行的起始位置,以及1L+length(x$bar)处的额外元素。如果我们选择w元素,我们就有了run的起始位置。如果我们选择w+1元素并从中减去一个元素,我们就得到了运行的结束位置。

答案 1 :(得分:2)

我们可以使用rle来获取vector(或列)中相同元素的长度和值。获取“长度”的逻辑索引,其等于“值”的最大长度为1.否定它并将这些“值”分配给0.使用inverse.rle我们得到vector原始长度。要查找非0的元素,请使用which并使用sum来计算。

 v1 <- inverse.rle(within.list(rle(x$bar), 
   values[!(lengths==max(lengths[values==1]) & values!=0)] <- 0))
 which(v1!=0)
 #[1] 18 19 20 21 22
 sum(v1)
 #[1] 5