我想使用data.table包根据多个不等式条件对数据进行子集化。 data.table手册中的示例显示了如何使用字符变量执行此操作,但不使用数字不等式。我还看到如何使用子集函数执行此操作。但我真的想利用data.table二进制搜索速度。以下是我想要做的一个例子。
library(data.table)
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
data
setkey(data, X, Y, Z)
#the data.frame way
data[X > 0 & Y > 0 & Z > 0]
#the data.table way (does not work as I expected)
data[J(>0, >0, >0)]
答案 0 :(得分:0)
使用软件包dplyr,解决方案非常快速和简单。
install.packages(dplyr)
library(dplyr)
newdata <- filter(data, X > 0 , Y > 0 , Z > 0)
dplyr显示为管理数据框架最简单,最快速的软件包之一。在这里查看这个很棒的教程:http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html
RStudio团队还制作了一个很好的备忘单,在这里:http://www.rstudio.com/resources/cheatsheets/
答案 1 :(得分:0)
我运行了一些基准测试
library(dplyr)
library(data.table)
library(microbenchmark)
dt.data.frame.way <- function(data) data[X > 0 & Y > 0 & Z > 0]
dplyr.way <- function(df) filter(df, X > 0, Y > 0, Z > 0)
real.data.frame.way <- function(df) df[df$X > 0 & df$Y > 0 & df$Z > 0,]
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
setkey(data, X, Y, Z)
df <- as.data.frame(data)
microbenchmark(times = 10,
dt.data.frame.way(data),
dplyr.way(df),
real.data.frame.way(df))
# Unit: microseconds
# expr min lq mean median uq max neval
# dt.data.frame.way(data) 710.426 754.287 871.8784 824.7565 942.998 1180.458 10
# dplyr.way(df) 951.309 1045.246 12303.3462 1142.7440 1246.668 112775.934 10
# real.data.frame.way(df) 137.239 162.591 181.5254 187.9785 197.373 231.594 10
简单克隆示例数据到5.5M行。
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
data <- rbindlist(lapply(1:5e5, function(i) data)) # 5500000 rows
setkey(data, X, Y, Z)
df <- as.data.frame(data)
microbenchmark(times = 10,
dt.data.frame.way(data),
dplyr.way(df),
real.data.frame.way(df))
# Unit: milliseconds
# expr min lq mean median uq max neval
# dt.data.frame.way(data) 656.2978 668.0560 730.9246 696.6560 831.0877 846.0517 10
# dplyr.way(df) 632.4096 639.1141 709.4308 678.9436 717.3018 1015.7663 10
# real.data.frame.way(df) 964.4298 1022.1772 1075.8448 1077.4437 1125.0037 1192.7410 10
该任务的表现似乎难以改善。通常取决于数据。