【问题标题】:R iterate over consecutive pairs in a listR 遍历列表中的连续对
【发布时间】:2021-05-04 20:45:38
【问题描述】:

假设我有以下向量:

v1 = c(1,2,3,4)

我需要以成对的方式迭代这个向量,比如(1,2), (2,3), (3,4)。对于python,这里有解决这个问题的方法:Iterate over all pairs of consecutive items in a list。可以在 R 中实现类似的解决方案吗?

【问题讨论】:

    标签: r list


    【解决方案1】:

    我们可以删除firstlast 元素并连接到Map

    Map(c,  v1[-length(v1)], v1[-1])
    #[[1]]
    #[1] 1 2
    
    #[[2]]
    #[1] 2 3
    
    #[[3]]
    #[1] 3 4
    

    rbind 并使用asplit

    asplit(rbind(v1[-length(v1)], v1[-1]), 2)
    

    【讨论】:

      【解决方案2】:

      只是cbind 移位的向量。

      cbind(v1[-length(v1)], v1[-1])
      #      [,1] [,2]
      # [1,]    1    2
      # [2,]    2    3
      # [3,]    3    4
      

      R是向量化的,不需要迭代。

      【讨论】:

        【解决方案3】:

        通过将 2 替换为其他数字,这些解决方案都可以轻松推广到大于 2 的窗口。

        1) rollapplytoString 替换为您想要使用的任何功能。

        library(zoo)
        rollapply(v1, 2, toString)
        ## [1] "1, 2" "2, 3" "3, 4"
        

        1a) 或创建一个 2 列矩阵,然后在第二步中对其进行迭代:

        library(zoo)
        m <- rollapply(v1, 2, c)
        apply(m, 1, toString)
        ## [1] "1, 2" "2, 3" "3, 4"
        

        2) 嵌入 或使用embed。这不使用任何包。

        e <- embed(v1, 2)[, 2:1]
        apply(e, 1, toString)
        ## [1] "1, 2" "2, 3" "3, 4"
        

        【讨论】:

          【解决方案4】:

          使用embed + asplit 的基本 R 选项

          > asplit(embed(v1,2)[,2:1],1)
          [[1]]
          [1] 1 2
          
          [[2]]
          [1] 2 3
          
          [[3]]
          [1] 3 4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-27
            • 2016-09-19
            • 2014-09-26
            • 2021-11-19
            • 2014-12-05
            • 1970-01-01
            • 1970-01-01
            • 2017-03-01
            相关资源
            最近更新 更多