基本上,我需要实现的是矢量值的所有组合的列表,但要运行给定长度的低谷窗口。显示起来比解释起来容易。
假设我有window.size
的{{1}}
3
这就是我需要的输出
vector <- c("goofy", "mickey", "donald", "foo", "bar")
由于这将在蒙特卡洛迭代中结束,因此from | to
------+-----
goofy | mickey
goofy | donald
mickey| donald
mickey| foo
donald| bar
donald| foo
foo | bar
应该是参数
我认为使用dplyr和tidyr可以很容易地做到这一点,但我不知道该怎么做。
谢谢!
答案 0 :(得分:5)
使用rollapply
和dplyr
。需要使用c
,do.call
,as.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
答案 1 :(得分:2)
您可以使用索引逻辑和子集来构成以下形式:
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]]
)
答案 2 :(得分:1)
您可以使用lead
软件包中的dplyr
。
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