【问题标题】:R Split a Vector to Overlapping Sub-Vectors and Conjoin the First and the Last ElementsR将向量拆分为重叠的子向量并连接第一个和最后一个元素
【发布时间】:2021-09-28 20:20:53
【问题描述】:

我想split 使用 R 来遵循这三 (3) 个条件的向量:

  1. 具有相等的长度l
  2. 与常数值重叠ov
  3. 父向量的第一个元素和最后一个元素应该是最后一个块(只有两个元素)。

我得到下面的R代码满足前两个条件如下

ts = 1:10
l = 7
ov = l -1

library(tidyverse)
anil <- function(ts, l, ov){
  seq_len((length(ts) - ov) %/% (l - ov) +1) %>%
    as.data.frame() %>%
    setNames('id') %>%
    mutate(start = accumulate(id, ~ .x + l - ov),
           end = pmin(start + l - 1, length(ts)),
           start = pmin(start, end - l + 1)) %>%
    filter(!duplicated(paste(start, end, sep = '-'))) %>%
    transmute(desired = map2(start, end, ~ ts[.x:.y])) %>%
    as.list
}

anil(ts, l, ov)

我得到了这个结果:

>$desired[[1]]
[1] 1 2 3 4 5 6 7

>$desired[[2]]
[1] 2 3 4 5 6 7 8

>$desired[[3]]
[1] 3 4 5 6 7 8 9

>$desired[[4]]
[1]  4  5  6  7  8  9 10

我需要帮助来满足`第三个条件。

我希望我的结果如下所示:

>$desired[[1]]
[1] 1 2 3 4 5 6 7

>$desired[[2]]
[1] 2 3 4 5 6 7 8

>$desired[[3]]
[1] 3 4 5 6 7 8 9

>$desired[[4]]
[1]  4  5  6  7  8  9 10

>$desired[[5]]
[1]  1  10

【问题讨论】:

    标签: r split


    【解决方案1】:

    也许我们可以将以下代码与embed + asplit + range 一起使用

    c(
      asplit(embed(ts, l)[seq(1, length(ts) - l + 1, l - ov), l:1], 1),
      list(range(ts))
    )
    

    给了

    [[1]]
    [1] 1 2 3 4 5 6 7
    
    [[2]]
    [1] 2 3 4 5 6 7 8
    
    [[3]]
    [1] 3 4 5 6 7 8 9
    
    [[4]]
    [1]  4  5  6  7  8  9 10
    
    [[5]]
    [1]  1 10
    

    【讨论】:

      【解决方案2】:

      summarise 中在as.list 之前附加“ts”的range

      anil <- function(ts, l, ov){
        seq_len((length(ts) - ov) %/% (l - ov) +1) %>%
          as.data.frame() %>%
          setNames('id') %>%
          mutate(start = accumulate(id, ~ .x + l - ov),
                 end = pmin(start + l - 1, length(ts)),
                 start = pmin(start, end - l + 1)) %>%
          filter(!duplicated(paste(start, end, sep = '-'))) %>%
          transmute(desired = map2(start, end, ~ ts[.x:.y])) %>%
          summarise(desired = c(desired, list(range(ts)))) %>%
          as.list
          
      }
      

      -测试

      anil(ts, l, ov)
      $desired
      $desired[[1]]
      [1] 1 2 3 4 5 6 7
      
      $desired[[2]]
      [1] 2 3 4 5 6 7 8
      
      $desired[[3]]
      [1] 3 4 5 6 7 8 9
      
      $desired[[4]]
      [1]  4  5  6  7  8  9 10
      
      $desired[[5]]
      [1]  1 10
      

      【讨论】:

      • @DanielJames 是 R 控制台标志。只需复制并粘贴anil(ts, l, ov)
      猜你喜欢
      • 2021-11-21
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2013-11-18
      • 2011-04-14
      • 2016-08-19
      相关资源
      最近更新 更多