如何列出以正确顺序发生的事件的所有排列?

问题描述 投票:0回答:3

我有一张事件表,上面列出了它们发生的时间。他们已经按时间排序。

   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中有几个函数可以获取某种组合或排列,但是我还没有发现任何考虑输入中出现顺序的函数。

是否有执行此操作的功能,或者我必须实现自己的功能?

r permutation
3个回答
2
投票

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

t(combn(events$name, 2))

     [,1]    [,2]     
[1,] "sow"   "water"  
[2,] "sow"   "harvest"
[3,] "water" "harvest"

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


0
投票

经过一番思考,我意识到当对数字使用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)

}
© www.soinside.com 2019 - 2024. All rights reserved.