在 R 中自动化子集命令
Automating the subset command in R
给定脚本根据给定条件对 R 中的鸢尾花数据进行子集化。然而,当同样的方法应用于非常大的数据时,比如 1000 万以上,这个解决方案就要折腾了。请帮助我以更快的方式在更短的时间内获得相同的结果。谢谢
iris1 <- subset(iris,iris$Sepal.Length<=5 & iris$Sepal.Length >= 3)
你试过了吗data.table
?
执行此操作的标准方法是:
library(data.table)
iris <- iris
setDT(iris)
# you could try here "setkey(iris, Sepal.Length)" but shouldn't matter
iris1 <- iris[Sepal.Length %between% c(3, 5)]
对数据框进行子集化的最快方法肯定是使用 -data.table- 包将其转换为数据 table。
# Load -data.table- package
library(data.table)
# Convert iris to a data table
dt <- as.data.table(iris)
# Subset data table using conditions on Sepal.Length
dt1 <- dt[Sepal.Length<=5 & Sepal.Length >= 3]
我使用三种不同的方法进行了以下基准测试来比较子集:来自基础 R 的 subset
函数、dplyr
和基于示例数据的 data.table
具有 10000050 行的框架。结果显示data.table
最快。
library(dplyr)
library(data.table)
library(microbenchmark)
# Create example data frame with 10000050 rows
dat <- iris[rep(1:150, times = 66667), ]
# Create example tibble
dat_tbl <- as_tibble(dat)
# Create example data.table
dat_dt <- as.data.table(dat)
# Conduct benchmarking
per <- microbenchmark(# Method 1: The base R subset function
m1 = {subset(dat, Sepal.Length <= 5 & Sepal.Length >= 3)},
# Method 2: The dplyr method
m2 = {dat_tbl %>% filter(Sepal.Length <= 5, Sepal.Length >= 3)},
# Method 3: The data.table method
m3 = {dat_dt[Sepal.Length %between% c(3, 5), ]}, times = 1000L)
per
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 381.17382 776.68467 961.2284 849.74441 1144.4295 2384.084 1000
# m2 115.79736 137.92646 295.3928 146.91114 511.5023 1452.713 1000
# m3 50.05212 63.57618 201.6751 70.98142 413.5645 1227.321 1000
# Plot the result
library(ggplot2)
autoplot(per)
给定脚本根据给定条件对 R 中的鸢尾花数据进行子集化。然而,当同样的方法应用于非常大的数据时,比如 1000 万以上,这个解决方案就要折腾了。请帮助我以更快的方式在更短的时间内获得相同的结果。谢谢
iris1 <- subset(iris,iris$Sepal.Length<=5 & iris$Sepal.Length >= 3)
你试过了吗data.table
?
执行此操作的标准方法是:
library(data.table)
iris <- iris
setDT(iris)
# you could try here "setkey(iris, Sepal.Length)" but shouldn't matter
iris1 <- iris[Sepal.Length %between% c(3, 5)]
对数据框进行子集化的最快方法肯定是使用 -data.table- 包将其转换为数据 table。
# Load -data.table- package
library(data.table)
# Convert iris to a data table
dt <- as.data.table(iris)
# Subset data table using conditions on Sepal.Length
dt1 <- dt[Sepal.Length<=5 & Sepal.Length >= 3]
我使用三种不同的方法进行了以下基准测试来比较子集:来自基础 R 的 subset
函数、dplyr
和基于示例数据的 data.table
具有 10000050 行的框架。结果显示data.table
最快。
library(dplyr)
library(data.table)
library(microbenchmark)
# Create example data frame with 10000050 rows
dat <- iris[rep(1:150, times = 66667), ]
# Create example tibble
dat_tbl <- as_tibble(dat)
# Create example data.table
dat_dt <- as.data.table(dat)
# Conduct benchmarking
per <- microbenchmark(# Method 1: The base R subset function
m1 = {subset(dat, Sepal.Length <= 5 & Sepal.Length >= 3)},
# Method 2: The dplyr method
m2 = {dat_tbl %>% filter(Sepal.Length <= 5, Sepal.Length >= 3)},
# Method 3: The data.table method
m3 = {dat_dt[Sepal.Length %between% c(3, 5), ]}, times = 1000L)
per
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 381.17382 776.68467 961.2284 849.74441 1144.4295 2384.084 1000
# m2 115.79736 137.92646 295.3928 146.91114 511.5023 1452.713 1000
# m3 50.05212 63.57618 201.6751 70.98142 413.5645 1227.321 1000
# Plot the result
library(ggplot2)
autoplot(per)