【发布时间】: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 中实现类似的解决方案吗?
【问题讨论】:
假设我有以下向量:
v1 = c(1,2,3,4)
我需要以成对的方式迭代这个向量,比如(1,2), (2,3), (3,4)。对于python,这里有解决这个问题的方法:Iterate over all pairs of consecutive items in a list。可以在 R 中实现类似的解决方案吗?
【问题讨论】:
我们可以删除first 和last 元素并连接到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)
【讨论】:
只是cbind 移位的向量。
cbind(v1[-length(v1)], v1[-1])
# [,1] [,2]
# [1,] 1 2
# [2,] 2 3
# [3,] 3 4
R是向量化的,不需要迭代。
【讨论】:
通过将 2 替换为其他数字,这些解决方案都可以轻松推广到大于 2 的窗口。
1) rollapply 将toString 替换为您想要使用的任何功能。
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"
【讨论】:
使用embed + asplit 的基本 R 选项
> asplit(embed(v1,2)[,2:1],1)
[[1]]
[1] 1 2
[[2]]
[1] 2 3
[[3]]
[1] 3 4
【讨论】: