考虑我有一个这样的数据框,
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这样的解释语言是否有缺点。软件建议也可以接受。
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 略有不同 - 它只保留唯一的行 - 因此这可能不是您所需要的。
在我的电脑上,这一切只需要不到一秒钟的时间。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |