df %>% split(.$x)
trở nên chậm đối với số lượng lớn các giá trị duy nhất của x. Thay vào đó, nếu chúng ta chia khung dữ liệu theo cách thủ công thành các tập con nhỏ hơn và sau đó thực hiện chia nhỏ trên mỗi tập hợp con, chúng tôi sẽ giảm thời gian xuống ít nhất một bậc độ lớn.Tại sao phân chia không hiệu quả trên các khung dữ liệu lớn với nhiều nhóm?
library(dplyr)
library(microbenchmark)
library(caret)
library(purrr)
N <- 10^6
groups <- 10^5
df <- data.frame(x = sample(1:groups, N, replace = TRUE),
y = sample(letters, N, replace = TRUE))
ids <- df$x %>% unique
folds10 <- createFolds(ids, 10)
folds100 <- createFolds(ids, 100)
Chạy microbenchmark
cho chúng ta
## Unit: seconds
## expr mean
l1 <- df %>% split(.$x) # 242.11805
l2 <- lapply(folds10, function(id) df %>%
filter(x %in% id) %>% split(.$x)) %>% flatten # 50.45156
l3 <- lapply(folds100, function(id) df %>%
filter(x %in% id) %>% split(.$x)) %>% flatten # 12.83866
là split
không được thiết kế cho các nhóm lớn? Có bất kỳ lựa chọn thay thế nào ngoài đặt giá thầu ban đầu thủ công không?
Máy tính xách tay của tôi là một macbook pro vào cuối năm 2013, 2.4GHz 8GB
Tôi muốn xử lý các mục danh sách kết quả song song, tức là 'list_of_dataframes%>% map (sequentially_process_each_row_of_df)' – Rickard
Hãy xem xét, cũng 'order'ing' df' trước 'split'ting, để' .Internal (split()) 'truy cập bộ nhớ liên tục hơn -' system.time ({a = split (df, df $ x)}); system.time ({odf = df [thứ tự (df $ x),]; b = phân tách (odf, odf $ x)}); giống hệt nhau (a, b) ' –
@alexis_laz thực sự, thứ tự tạo tên hàng, thay vì cải thiện mẫu truy cập bộ nhớ - so sánh' .row_names_info (df) 'và' .row_names_info (df [order (df $ x),]) ' ; giá trị âm trong trường hợp đầu tiên chỉ ra rằng các tên hàng được lưu trữ gọn gàng như 'c (NA, 1000000)', giá trị dương trong trường hợp thứ hai mà chúng được lưu trữ theo nghĩa đen là một vector nguyên. –