【发布时间】:2021-07-06 11:58:56
【问题描述】:
我想将一个向量拆分为一组子向量,以使这些条件成立:
-
所有子向量必须具有恒定长度
-
所有子向量必须以恒定的重叠长度重叠
我需要对此进行修改:
########Block function######################
blocks <- function(len, ov, n) {
starts <- unique(sort(c(seq(1, n, len), seq(len-ov+1, n, len))))
ends <- pmin(starts + len - 1, n)
# truncate starts and ends to the first num elements
num <- match(n, ends)
head(data.frame(starts, ends), num)
}
########Moving block#############
vec = 1:17 # a list or vector
len = 8 # the length of the subvector
ov = ceiling(len/2) # the length of overlap
b <- blocks(len, ov, length(vec))
with(b, Map(function(i, j) vec[i:j], starts, ends))
产生这个:
[1] 1 2 3 4 5 6 7 8 # 子向量1
[2] 5 6 7 8 9 10 11 12 # 子向量2
[3] 9 10 11 12 13 14 15 16 # 子向量3
[4] 13 14 15 16 17 # 子向量4:重叠需要修改以达到恒定长度
我想要什么
我希望最后一个未达到指定长度的子向量有这样的重叠:
new_overlap = old_overlap + (old_length - new_length)
-
new_overlap 是其长度小于设定长度的最后一个子向量的重叠长度。
-
old_overlap 是设定的重叠长度
-
old_length 是子向量的设定长度
[1] 1 2 3 4 5 6 7 8 # 我想要的子向量1
[2] 5 6 7 8 9 10 11 12 # 我想要的子向量2
[3] 9 10 11 12 13 14 15 16 # 我想要的子向量3
[4] 10 11 12 13 14 15 16 17 # 我想要的子向量4
我希望按照以下条件拆分列表:
-
它应该具有相同的子列表长度。
-
它应该与一个常数重叠
尝试的解决方案有错误消息但结果很好
blocks <- function(len, ov, n) {
starts <- unique(sort(c(seq(1, n, len), seq(len-ov+1, n, len))))
ends <- pmin(starts + len - 1, n)
# truncate starts and ends to the first num elements
num <- match(n, ends)
head(data.frame(starts, ends), num)
}
########Moving block#############
vec = 1:10 # vector
len = 5 #set length
ov = 1#ceiling(len/2) # set overlap
b <- blocks(len, ov, length(vec))
#with(b, Map(function(i, j) vec[i:j], starts, ends))
out <- with(b, Map(function(i, j) vec[i:j], starts, ends))
last_1en <- length(out)
if(length(out[l1]) < len) { # if last length is less than set length
out[[l1]] <- unlist(out[(ov) + (len - l1)])
}
out
out[[l1]] 错误:下标越界
[[1]] [1] 1 2 3 4 5
[[2]] [1] 5 6 7 8 9
[[3]] [1] 6 7 8 9 10
二次编辑
我已通过将out[[l1]] 更改为out[l1] 来调试错误。
【问题讨论】:
-
您可以将
b修改为b$starts[nrow(b)] <- b$ends[nrow(b)] - len + 1 -
要求的结果不满足您陈述的条件。
-
@norie 你能帮我指出来吗?
-
最后一个子向量的重叠是7,不是4。
-
也可以尝试将函数第一行
blocks改为starts <- pmin(n-len+1, unique(sort(c(seq(1, n, len), seq(len-ov+1, n, len)))))