基于上一个值和下一个值拆分并枚举R中的序列元素

基于上一个值和下一个值拆分并枚举R中的序列元素,r,dplyr,R,Dplyr,这个问题让我发疯。假设我有一个布尔向量中的序列: switch <- c(TRUE, TRUE, FALSE, TRUE, rep(FALSE, 6), TRUE, rep(FALSE, 7), TRUE, TRUE, TRUE, FALSE, TRUE) 虽然一开始这看起来很琐碎,但我无法找到一种有效的方法在R中实现它。您所需的输出与您提供的数据不匹配,因此我不完全确定您想要什么,但这里是一种尝试 # construct data dat <- data.frame(switch

这个问题让我发疯。假设我有一个布尔向量中的序列:

switch <- c(TRUE, TRUE, FALSE, TRUE, rep(FALSE, 6), TRUE, rep(FALSE, 7), TRUE, TRUE, TRUE, FALSE, TRUE)

虽然一开始这看起来很琐碎,但我无法找到一种有效的方法在R中实现它。

您所需的输出与您提供的数据不匹配,因此我不完全确定您想要什么,但这里是一种尝试

# construct data
dat <- data.frame(switch=switch, set=NA_integer_)

# get the groupings
dat$set[switch] <- cumsum(c(1, diff(which(switch)) > 5))

您想要的输出与您提供的数据不匹配,因此我不完全确定您想要什么,但这里有一个尝试

# construct data
dat <- data.frame(switch=switch, set=NA_integer_)

# get the groupings
dat$set[switch] <- cumsum(c(1, diff(which(switch)) > 5))

这里有一个选项带有
rle

(NA^!switch) * with(rle(switch), rep(cumsum(lengths > 5 & !values), lengths) + 1) 
#[1]  1  1 NA  1 NA NA NA NA NA NA  2 NA NA NA NA NA NA NA  3 NA NA NA NA NA NA  4  4 NA  4
数据
开关这里有一个带有
rle的选项

(NA^!switch) * with(rle(switch), rep(cumsum(lengths > 5 & !values), lengths) + 1) 
#[1]  1  1 NA  1 NA NA NA NA NA NA  2 NA NA NA NA NA NA NA  3 NA NA NA NA NA NA  4  4 NA  4
数据
一定要切换。一句台词是一个非常传统的说法。当然。一句话是一个非常传统的说法。
switch <- c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE,   
TRUE)