gpt4 book ai didi

r - 查找并中断重复运行

转载 作者:行者123 更新时间:2023-12-03 13:31:42 25 4
gpt4 key购买 nike

我有一个带有重复图案的向量。我想打破n长度重复模式改变的任何地方。
数据如下:

x <- c(rep(1:4, 5), rep(5:6, 3), rep(c(1, 4, 7), 5), rep(c(1, 5, 7), 1), rep(2:4, 3))

## [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 5 6 5 6 1 4 7 1 4 7 1 4 7 1 4 7 1 4 7 1 5 7 2 3 4 2 3 4 2 3 4


我希望能够找到模式更改的那些地方,以便像这样中断:

enter image description here

我认为 rle可能有用,但不知道如何使用。

最佳答案

这是执行此操作的功能。顺便说一句,这是遗传学中的一个问题-查找串联重复序列。 Here's a link to an algorithm paper比这好得多,但实现起来却复杂得多。

输出是将x拆分为组的向量。

首先是一个辅助函数:

factorise <- function(x) {
x <- length(x)
if(x == 1){return(1)}
todivide <- seq(from = 2, to = x)
out <- todivide[x %% todivide == 0L]
return(out)
}


现在的主要功能是:

findreps <- function(x, counter = NULL){
if(is.null(counter)){
counter <- c()
maxcounter <- 0
} else {
maxcounter <- max(counter)
}
holding <- lapply(1:length(x), function(y){x[1:y]})
factors <- lapply(holding, factorise)
repeats <- sapply(1:length(factors), function(index) {any(sapply(1:length(factors[[index]]), function(zz) {all((rep(holding[[index]][1:(length(holding[[index]])/factors[[index]][zz])], factors[[index]][zz]))==holding[[index]])}))})
holding <- holding[max(which(repeats))][[1]]
if(length(holding) == length(x)){
return(c(counter, rep(maxcounter + 1, length(x))))
} else {
counter <- c(counter, rep(maxcounter + 1, length(holding)))
return(findreps(x[(length(holding) + 1):length(x)], counter))
}
}


这个怎么运作:
它是一个递归函数,它会从向量的开头截断它可以找到的最大重复组,然后运行直到它们全部消失为止。

首先,为最终输出创建一个 counter

接下来,我们将 x分成从1开始的每个子集,成为列表 holding

然后我们找到除1以外的所有其他因素。

然后是最糟糕的部分。我们取最大子集的每个子集,并在重复合理的次数后检查其是否等于其组中最大的子集。

findreps(x)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
[37] 3 3 3 3 3 4 5 6 7 7 7 7 7 7 7 7 7


如果您希望将非重复分组,我们可以使用 dplyrtidyr

library(dplyr)
library(tidyr)

z <- data.frame(x = x, y = findreps(x))

z %>% mutate(y = ifelse(duplicated(y) | rev(duplicated(rev(y))), y, NA),
holding = c(0, y[2:n()])) %>%
fill(holding) %>%
mutate(y = ifelse(is.na(y), holding +1, y)) %>%
select(-holding)


这使:

 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 7 7 7 7 7 7 7 7
[53] 7

关于r - 查找并中断重复运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33155662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com