【问题标题】:How to list all permutations of events which happened in the right order?如何列出以正确顺序发生的事件的所有排列?
【发布时间】:2020-02-05 02:14:33
【问题描述】:

我有一张事件表,上面有事件发生时间的指示。它们已经按时间排序。

   events <- data.frame(name=c("sow", "water", "harvest"), time=c("March", "May", "June"), stringsAsFactors = FALSE)

我想获得一个列表,列出所有事件的 2 元素排列,这些排列发生在彼此之后(没有重复)。

earlier    later
sow        water
sow        harvest
water      harvest

我知道 R 中有几个函数用于获取某种组合或排列,但我没有找到任何考虑输入中出现顺序的函数。

有没有这样的功能,还是我必须自己实现?

【问题讨论】:

  • 如果事件按时间顺序排列,您可以:t(combn(events$name, 2))?
  • @Ben 是的,它们是订购的,或者至少很容易订购,因为我有专栏。什么是 t 函数?我不记得以前看过它,搜索r t 不会返回太多相关内容。
  • @Ben 啊,我明白了,谢谢。并且combn 是否保证始终返回组合,以便首先列出具有“较小数字”的项目,或者这是理论上可能在版本之间发生变化的实现细节?我没有看到帮助文件中提到的顺序(我这次是在控制台中打开的:))
  • @Ben 我很乐意将其视为答案。某天更改顺序的缺点纯粹是理论上的,它比现有答案要简洁得多。

标签: r permutation


【解决方案1】:

我使用lapply得出了类似的结论

df <- lapply(1:nrow(events), function(x) {
              expand.grid(events$name[x], events$name[(x+1):nrow(events)])})
do.call(rbind, df[-nrow(events)])
#>    Var1    Var2
#> 1   sow   water
#> 2   sow harvest
#> 3 water harvest

【讨论】:

    【解决方案2】:

    假设您的列已按所需顺序,您可以使用combn 函数并转置:

    t(combn(events$name, 2))
    
         [,1]    [,2]     
    [1,] "sow"   "water"  
    [2,] "sow"   "harvest"
    [3,] "water" "harvest"
    

    【讨论】:

      【解决方案3】:

      经过一番思考,我意识到这在对数字使用 expand.grid 时相对容易实现。

      events <- data.frame(name=c("sow", "water", "harvest"), month=c("3", "5", "6"), stringsAsFactors = FALSE)
      
      ordered.pairs <- function(events.names.in.order) {
      
      n <- length(events.names.in.order)
      numbers.to.use <- 1:n
      doubled.indices <- expand.grid(numbers.to.use, numbers.to.use)
      doubled.indices <- doubled.indices[doubled.indices$Var1 < doubled.indices$Var2,]
      
      event.pairs <- data.frame(earlier=events.names.in.order[doubled.indices$Var1], later=events.names.in.order[doubled.indices$Var2])
      
      return(event.pairs)
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多