Генерация бегущих комбинаций векторных значений в R - PullRequest
0 голосов
/ 28 августа 2018

То, что мне нужно, это в основном список всех комбинаций векторных значений, кроме запуска через окна заданной длины. Проще показать, чем объяснить.

Допустим, у меня есть window.size из 3

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, но я не смог понять, как это сделать.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы можете использовать 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
0 голосов
/ 28 августа 2018

С 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
0 голосов
/ 28 августа 2018

Вы можете поиграть с логикой индексов и подмножеством, чтобы сделать обобщенную форму:

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]]
)
...