在R

时间:2018-08-28 15:18:45

标签: r dplyr tidyr

基本上,我需要实现的是矢量值的所有组合的列表,但要运行给定长度的低谷窗口。显示起来比解释起来容易。

假设我有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可以很容易地做到这一点,但我不知道该怎么做。

谢谢!

3 个答案:

答案 0 :(得分:5)

使用rollapplydplyr。需要使用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

答案 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