Đây là chức năng để thực hiện. Nhân tiện, đây là một vấn đề trong di truyền học - tìm lặp lại song song. Here's a link to an algorithm paper đó là một điều trị tốt hơn nhiều so với điều này, nhưng phức tạp hơn nhiều để thực hiện.
Đầu ra là một vectơ của các nhóm để chia x thành.
Đầu tiên một hàm helper:
factorise <- function(x) {
x <- length(x)
if(x == 1){return(1)}
todivide <- seq(from = 2, to = x)
out <- todivide[x %% todivide == 0L]
return(out)
}
Bây giờ chức năng chính:
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))
}
}
Cách hoạt động: Đó là một hàm đệ quy mà chạy, cắt nhóm lặp lớn nhất nó có thể tìm thấy từ sự bắt đầu của vectơ, và sau đó chạy cho đến khi tất cả chúng biến mất.
Trước tiên, chúng tôi tạo một counter
để có kết quả cuối cùng.
Tiếp theo, chúng tôi chia x
thành mỗi tập hợp con bắt đầu từ 1 thành danh sách, holding
.
Sau đó, chúng tôi tìm thấy tất cả các yếu tố về kích thước của một nhóm, ngoại trừ 1.
Sau đó, phần tồi tệ nhất. Chúng tôi lấy từng tập hợp con của tập hợp con lớn nhất và kiểm tra xem tập hợp con có bằng tập hợp con lớn nhất trong nhóm của nó sau khi được lặp lại số lần hợp lý hay không.
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
Nếu bạn muốn không lặp lại được nhóm, chúng ta có thể sử dụng một chút dplyr
và tidyr
:
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)
Mà cho:
[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
upvoting nhưng không chắc chắn nguyên tắc phân vùng này là được xác định rõ. Có thể '1 1 2' là một mẫu lặp lại hay là chữ số luôn luôn duy nhất trong một lần chạy? – Frank
Có độ dài tối đa mà một mẫu có thể có không? – RHA
@RHA không có độ dài tối đa –