【问题标题】:Split vector to equal-overlapping sub-vector length when the sub-vector length is even or odd当子向量长度为​​偶数或奇数时,将向量拆分为相等重叠的子向量长度
【发布时间】:2020-09-10 23:17:06
【问题描述】:

给定 vec <- 1:nl 的向量作为子向量长度,我想要一个 R 函数将向量分解为子向量。当l 为偶数时,此R 函数有效。

splitWithOverlap <- function(vec, seg.length, overlap) {      
  starts = seq(1, length(vec) - 1, by=seg.length-overlap)
  ends   = starts + seg.length - 1
  ends[ends > length(vec)] = length(vec)  
  lapply(1:length(starts), function(i) vec[starts[i]:ends[i]])
}
## try the function
vec <- 1:17
l <- 6
ov = ceiling(l/2)
splitWithOverlap(vec, l, ov)

问题是当l 是奇数时,无法找到中途。 l 奇数的解决方案可以通过告诉 Rov = ceiling(l/2)ov = ceiling(l/2) - 1 之间交替来解决,这样我就会得到类似 Figure 2Figure 4

【问题讨论】:

  • 如果你只需要在ceiling(l/2)为偶数和ceiling(l/2)-1为奇数之间切换,你可以将重叠的计算移到函数中,并使用模来检查l是偶数还是奇怪的。 l%%2==0 对偶数为 TRUE。
  • 请进行更好的演示!

标签: r split


【解决方案1】:

这给出了每个图下方列出的lenov(重叠)以及x 的数量n 的开始和结束。在输出中,start[i] 是第 i 个块的开始,end[i] 是第 i 个块的结束。

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)
}

使用问题中数字下方列出的输入,我们可以仔细检查它是否确实为每个块提供了正确的开始和结束:

fig1 <- blocks(len = 2, ov = 1, n = 17)
str(fig1, vec.len = Inf)
## 'data.frame':   16 obs. of  2 variables:
##  $ starts: num  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
##  $ ends  : num  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      
fig2 <- blocks(len = 3, ov = 2, n = 17)
str(fig2, vec.len = Inf)
## 'data.frame':   11 obs. of  2 variables:
##  $ starts: num  1 2 4 5 7 8 10 11 13 14 16
##  $ ends  : num  3 4 6 7 9 10 12 13 15 16 17
          
fig3 <- blocks(len = 4, ov = 2, n = 17)
str(fig3, vec.len = Inf)
## 'data.frame':   8 obs. of  2 variables:
##  $ starts: num  1 3 5 7 9 11 13 15
##  $ ends  : num  4 6 8 10 12 14 16 17
      
fig4 <- blocks(len = 5, ov = 3, n = 17)
str(fig4, vec.len = Inf)
## 'data.frame':   6 obs. of  2 variables:
##  $ starts: num  1 3 6 8 11 13
##  $ ends  : num  5 7 10 12 15 17

fig5 <- blocks(len = 6, ov = 3, n = 17)
str(fig5, vec.len = Inf)
## 'data.frame':   5 obs. of  2 variables:
## $ starts: num  1 4 7 10 13
## $ ends  : num  6 9 12 15 17

【讨论】:

  • 你能告诉我你的回答是做什么的吗?
  • 添加了更多描述。我不知道为什么有人对此投了反对票,但它给出了与问题中的数字完全相同的块。
  • 我开始看到你的作品之美,你能证明startsends会产生预期的结果吗?
  • 我认为问题的症结在于问题中的数字所示的开始和结束,其余的从问题中的代码中已经很清楚了,但如果不是,请使用此代码获取区间内容列表:b &lt;- blocks(l, ov, length(vec)); with(b, Map(function(i, j) vec[i:j], starts, ends)) 其中lovvec 与问题相同。
  • 请告诉我nlenl 代表什么?
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2020-08-11
  • 2020-01-20
  • 2018-05-02
相关资源
最近更新 更多