例如,假设有一个data.frame
:
set.seed(1)
x = data.frame(foo=letters, bar=as.integer((rnorm(26) > 0.5)))
在此示例中,1
的最大连续条纹发生在第18行和第22行(包括第18行和第22行)之间。我想知道的是,如果有一个更大的框架,是否有一个很好的方法来识别这样的地方?我通常使用表格dplyr
并尝试使用特殊值cumprod
或cumsum
,但这两种方法似乎都没有削减它。
答案 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