我有一张事件表,上面列出了它们发生的时间。他们已经按时间排序。
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中有几个函数可以获取某种组合或排列,但是我还没有发现任何考虑输入中出现顺序的函数。
是否有执行此操作的功能,或者我必须实现自己的功能?
假设您的列已经按期望的顺序,您可以使用combn
函数并转置:
t(combn(events$name, 2))
[,1] [,2]
[1,] "sow" "water"
[2,] "sow" "harvest"
[3,] "water" "harvest"
我用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
经过一番思考,我意识到当对数字使用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)
}