我有一个向量,它看起来像这样
我需要得到1和-1的组,即1, -1
、1, 1, -1, -1, -1
、1, -1
最终目的是得到这些组的起始位置和结束位置,即,
起始位置:1, 3, 8
和结束位置:3, 8, 10
rle()
不太符合我的要求
r <- rle(c(1, -1, 1, 1, -1, -1, -1, 1, -1))
which(rep(x = diff(sign(diff(c(-Inf, r$values, -Inf)))) == -2, times = r$lengths))
# [1] 1 3 4 8
字符串
所以在这里,我不想要4
。
我举的例子中的向量可能并不能覆盖所有的基,这是完全合理的,我在向量中也有0
s,这永远不会与-1
和1
相交,例如。0 0 1 -1 1 1 -1 -1 -1 1 -1
或1 -1 1 1 -1 -1 -1 1 -1 0 0
或0 0 1 -1 1 1 -1 -1 -1 1 -1 0 0
或1 -1 0 0 1 1 -1 -1 -1 1 -1
都可能是有效的。
编辑:我试图替换的完整代码是
xc <- paste(as.character(sign(diff(x))), collapse = "")
xc <- gsub("1", "+", gsub("-1", "-", xc))
xc <- gsub("0", zero, xc)
peakpat <- sprintf("[+]{%d,}[-]{%d,}", nups, ndowns)
rc <- gregexpr(peakpat, xc)[[1]]
if (rc[1] < 0) return(NULL)
x1 <- rc
x2 <- rc + attr(rc, "match.length")
attributes(x1) <- NULL
attributes(x2) <- NULL
型
(see pracma::findpeaks()
).这段代码是 * 非常 * 慢,所以我试图解决它使用整数.到目前为止,我有
xc2 <- sign(diff(x))
changepoints <- cumsum(abs(c(1, diff(xc2) != 0)))
group_size <- tabulate(changepoints)
lag <- c(NA, group_size[seq_len(length(group_size) - 1)])
lead <- c(group_size[2:length(group_size)], NA)
rc1 <- rep(0L, length(xc2))
rc1[xc2 == 1 & rep(group_size >= nups, group_size) & rep(lead >= ndowns, group_size)] <- 1L
rc1[xc2 == -1 & rep(group_size >= ndowns, group_size) & rep(lag >= nups, group_size)] <- -1L
rc1_backup <- rc1
rc1[rc1 == 0] <- -1
x1 <- which(diff(c(0, rc1)) > 0)
rc1 <- rc1_backup
rc1[rc1 == 0] <- 1
x2 <- which(diff(c(rc1, 0)) > 0) + 1
型
这几乎工作......但不完全。
5条答案
按热度按时间vi4fp9gy1#
尝试
字符串
dffbzjpn2#
也许是这边
字符串
型
t98cgbkg3#
另一种方式,使用逻辑条件:
字符串
8gsdolmq4#
编辑以满足OP的更改:假设:
字符串
给出:
型
说明:
对于“start”,我们使用每个集合中第一个元素的位置。
对于“end”,我们使用NEXT集合的第一个元素的位置。
这意味着我们的断点都是起始位置,可以通过取向量1和(长度的累积和+1)
c(1, cumsum(testrle$lengths)+1)
来列出开始是根据数据集中
1
类型运行的顺序选择的,并且永远不能是最后一个:[c(testrle$values == 1, FALSE)]
根据数据集中
-1
类型的运行序列选择结束,通过插入FALSE
breaks[c(FALSE,c(testrle$values == -1))]
向结束移动一个位置(我们希望NEXT序列的开始)对于n和m(我称之为
num
和negnum
),我们只需要分别为1
或-1
的rle的长度。然后我通过
n
和m
进行过滤-我已经使用了dplyr::filter()
,但是如果你不喜欢使用外部包,有一些简单的R基方法可以做到这一点。编辑:测试与所有提供的例子:
bwleehnv5#
最后,
rle()
给了我所需要的,我只需要正确的子集。字符串