为所有可能的组合实现过滤的更快方法

may*_*din 5 combinations r

考虑我有一个这样的数据框,

set.seed(1)

q<-100

df <- data.frame(Var1 = round(runif(q,1,50)),
                    Var2 = round(runif(q,1,50)),
                        Var3 = round(runif(q,1,50)),
                            Var4 = round(runif(q,1,50)))
attach(df)
Run Code Online (Sandbox Code Playgroud)

如您所知,q代表设置数据帧中每列的长度。

我想对列的所有可能组合进行过滤。可以是任何东西。假设我正在寻找前两列之和与后两列之和的除法是否大于1。

使用expand.grid()功能可以实现这一目标。

a <- Sys.time()

expanded <- expand.grid(Var1, Var2, Var3, Var4)

Sys.time() - a

Time difference of 8.31997 secs


expanded  <- expanded[rowSums(expanded[,1:2])/ rowSums(expanded[,3:4])>1,]
Run Code Online (Sandbox Code Playgroud)

但是,这需要很多时间!为了使速度更快,我尝试rep.int()这个问题中使用函数来回答问题,并设计了自己的函数。

myexpand <- function(...) {

 sapply(list(...),function(y) rep.int(y, prod(lengths(list(...)))/length(y)))

}
Run Code Online (Sandbox Code Playgroud)

但这不是那么有希望。与我的期望和expand.grid他人的期望相比,它花费了更多的时间。而且,如果我设定更大q的期望值,那将成为一个难题!

在应用expand.grid或之前,是否有适当的方法可以通过矩阵运算更快(1-2秒)来实现这一目标myexpand。而且,我想知道使用R这样的解释语言是否有缺点。软件建议也可以接受。

Kel*_*lly 0

tidyr使用and怎么样dplyr

library(tidyr)
library(dplyr)

expanded <- 
  df %>% 
  expand(Var1, Var2, Var3, Var4)
  mutate(res = (Var1 + Var2)/(Var3 + Var4)) %>%
  filter(res > 1)
Run Code Online (Sandbox Code Playgroud)

请注意,expand 的工作方式与 Expand.grid 略有不同 - 它只保留唯一的行 - 因此这可能不是您所需要的。

在我的电脑上,这一切只需要不到一秒钟的时间。