Автоматизация команды подмножества в R

данный скрипт подмножает данные радужной оболочки в R на основе заданного условия. Однако, когда то же самое применяется к очень большим данным, скажем, к 10 миллионам+, решение теряет смысл. Пожалуйста, помогите мне с более быстрым способом достижения того же результата за меньшее время. Спасибо.

iris1 <- subset(iris,iris$Sepal.Length<=5 & iris$Sepal.Length >= 3)

person Adam Shaw    schedule 14.01.2018    source источник
comment
stackoverflow .com/questions/23755839/, я видел этот пост, но не могу настроить свой код таким же образом. Пожалуйста, предложите.   -  person Adam Shaw    schedule 14.01.2018
comment
@www, мне нужна помощь с этим вопросом, пожалуйста, помогите мне здесь stackoverflow.com/questions/48385417/   -  person Adam Shaw    schedule 22.01.2018


Ответы (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)]
person sindri_baldur    schedule 14.01.2018
comment
Большое спасибо за ответ, меня беспокоит, будет ли этот подход обрабатывать данные размером, скажем, 10M лучше, чем обычная функция подмножества? Пожалуйста, предложите. - person Adam Shaw; 14.01.2018
comment
Обычно data.table намного быстрее, чем базовый R. Почему бы не поэкспериментировать? - person sindri_baldur; 14.01.2018
comment
@snoram Спасибо, что показали использование синтаксиса %between%. Я следовал вашему примеру кода и провел бенчмаркинг, и data.table оказался самым быстрым. - person www; 14.01.2018

Я провел следующий бенчмаркинг, чтобы сравнить подмножество, используя три разных подхода: функция subset из базы R, 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)

введите здесь описание изображения

person www    schedule 14.01.2018
comment
Отлично, вы пробовали setkey(iris, Sepal.Length) тоже? Кажется, я где-то читал, что это не должно иметь значения в более новых версиях data.table, но, возможно, стоит попробовать. - person sindri_baldur; 14.01.2018
comment
@snoram Спасибо за ваш комментарий о звонке. Я этого не делал, но, как вы сказали, стоит попробовать. - person www; 14.01.2018

Самый быстрый способ создать подмножество фрейма данных — это, безусловно, преобразовать его в таблицу данных с помощью пакета -data.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]
person Kenneth Rios    schedule 14.01.2018
comment
iris — это встроенный фрейм данных в R. Вам не нужно создавать новый фрейм данных с именем iris, чтобы продемонстрировать это. - person www; 14.01.2018