我在R中有一個大型數據集(說> 40,000行和> 20個分類列),我反覆進行子集化處理,所以我想盡可能加快速度。它需要是一個通用函數(每個分類列有不同數量的可能值,比如字符串格式)。用多種條件在R中對子類別數據進行子集化的快速方法
每次I子集,我需要確定滿足多個邏輯集成員條件(例如> 10個條件)的行的子集。即,我需要檢查幾列,並檢查該列中的值是否與特定的成員資格相匹配(因此使用%in%
)。
# simple dataset example
library(dplyr)
num_col <- 15
num_row <- 100000
dat_list <- list()
for (i in 1:num_col) {
dat_list[[i]] <- data_frame(sample(letters[1:10], size = num_row, r = T))
}
dat <- bind_cols(dat_list)
names(dat) <- paste0("col", seq(15))
我看了看周圍的互聯網和很多,但沒有找到我正在尋找的性能的討論。我主要使用dplyr
進行編碼,所以如果在data.table
有明顯的性能改善,請致歉;我已經嘗試了兩個簡單的基準測試(但沒有使用任何data.table
索引等),如果速度更快,這並不明顯。
我考慮的實例中選擇(因爲我不是在data.table
很大,我已經排除從這裏data.table
選項):
base_filter <- function(dat) {
for (i in 1:7) {
col_name <- paste0('col', i)
dat <- dat[dat[[col_name]] %in% sample(letters[1:10], size = 4), ]
}
dat
}
dplyr_filter1 <- function(dat) {
for (i in 1:7) {
col_name <- paste0('col', i)
dat <- filter_(dat,
.dots = interp(~ colname %in% vals,
colname = as.name(col_name),
vals = sample(letters[1:10], size = 4)))
}
dat
}
dplyr_filter2 <- function(dat) {
dots_filter <- list()
for (i in 1:7) {
col_name <- paste0('col', i)
dots_filter[[i]] <- interp(~ colname %in% vals,
colname = as.name(col_name),
vals = sample(letters[1:10], size = 4))
}
filter_(dat, .dots = dots_filter)
}
注意:在實踐中,我的真實數據集,dplyr_filter2
實際工作最快的。我也試過dtplyr
或將我的數據轉換爲data.table
,但這看起來比沒有慢。
注意:另一方面,實際上,當數據的行數少,列數少(可能是由於複製速度?)時,基本R函數的性能優於dplyr
示例。
因此,我想問一下,在多個(集合成員資格)條件下對分類數據框進行子集化的一般,最有效的方法是什麼。如果可能的話,解釋爲什麼?對於較小的數據集,這個答案是否有區別它取決於複製時間還是搜索時間?
有用相關鏈接
你爲什麼要使用樣本()?看起來這會影響你的基準測試。 – Elin