【问题标题】:Generate running combinations of vector values in R在 R 中生成向量值的运行组合
【发布时间】:2018-08-29 01:11:48
【问题描述】:

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

假设我有一个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 可以轻松完成,但我无法弄清楚如何。

提前致谢!

【问题讨论】:

  • 不应该还有donaldfoo组合吗?
  • 听起来这基本上是你想要的基础:expand.grid(vector[1:3], vector[1:3]),然后它只需要扩展到滚动窗口。
  • 添加了 donald foo 组合,感谢您指出我的缺失:)

标签: r dplyr tidyr


【解决方案1】:

使用rollapplydplyr。需要cdo.callas.data.frame ugliness 将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

【讨论】:

  • 很好地使用了rollapply。次要建议:将group_by_all() %&gt;% slice(1) 替换为distinct()
  • @ArtemSokolov 谢谢。我完全忘记了distinct
  • 这里是另一个版本:rollapply(vector, 3, combn, 2, toString) %&gt;% c %&gt;% unique %&gt;% read.csv(text = ., header = FALSE, as.is = TRUE, col.names = c("from", "to"))
【解决方案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]]
)

【讨论】:

    【解决方案3】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多