在 R 中生成矢量值的运行组合

  • 本文关键字:运行 组合 r dplyr tidyr
  • 更新时间 :
  • 英文 :


我需要实现的基本上是向量值的所有组合的列表,但运行给定长度的槽窗口。展示比解释更容易。

假设我有window.size3

vector <- c("goofy", "mickey", "donald", "foo", "bar")

这是我需要的输出

from  |  to
------+-----
goofy | mickey
goofy | donald
mickey| donald
mickey| foo
donald| bar
donald| foo
foo   | bar

由于这将以蒙特卡洛迭代集结束,因此windows.size应该是参数化的

我认为使用 dplyr 和 tidyr 可以轻松完成,但我无法弄清楚如何完成。

提前感谢!

withrollapplyanddplyr.需要cdo.callas.data.frame丑陋才能将combn的输出转换为dplyr函数的数据帧:

library(zoo)
library(dplyr)
rollapply(vector, 3, combn, 2, simplify = FALSE) %>%
c() %>%
do.call(rbind, .) %>%
as.data.frame() %>%
distinct() %>%
setNames(c("from", "to"))

结果:

from     to
1  goofy mickey
2 mickey donald
3 donald    foo
4  goofy donald
5 mickey    foo
6 donald    bar
7    foo    bar

您可以使用索引逻辑和子集来制作可概括的形式:

data.frame(
from = vector[c(rep(1:3, each = 2), 4)],
to = vector[c(2, rep(3:5, each = 2))]
)
from     to
1  goofy mickey
2  goofy donald
3 mickey donald
4 mickey    foo
5 donald    foo
6 donald    bar
7    foo    bar

其中原始vector是:c("goofy", "mickey", "donald", "foo", "bar")

编辑

更可识别一点:

n <- length(vector)
data.frame(
from = vector[rep(1:(n-1), each = 2)[-2*n + 2]],
to = vector[rep(2:n, each = 2)[-1]]
)

您可以使用dplyr包中的lead

library(dplyr)
## Example of n = 2
n = 2
res = data.frame()
for(i in 1:n){res = na.omit(rbind(res,cbind(v,lead(v,i))))}
names(res) = c("from","to")
res
from     to
1  goofy mickey
2 mickey donald
3 donald    foo
4    foo    bar
5  goofy donald
6 mickey    foo
7 donald    bar
## Example of n = 4
n = 4
res = data.frame()
for(i in 1:n){res = na.omit(rbind(res,cbind(v,lead(v,i))))}
names(res) = c("from","to")
res
from     to
1   goofy mickey
2  mickey donald
3  donald    foo
4     foo    bar
5   goofy donald
6  mickey    foo
7  donald    bar
8   goofy    foo
9  mickey    bar
10  goofy    bar

最新更新