df %>% split(.$x)
एक्स के अनूठे मूल्यों की बड़ी संख्या के लिए धीमा हो जाता है। यदि हम डेटा फ्रेम को मैन्युअल रूप से छोटे सबसेट में विभाजित करते हैं और फिर प्रत्येक सबसेट पर विभाजित करते हैं तो हम कम से कम परिमाण के आदेश को कम करते हैं।कई समूहों के साथ बड़े डेटा फ्रेम पर विभाजित क्यों अक्षम है?
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)
रनिंग microbenchmark
हमें
## 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
split
बड़े समूहों के लिए नहीं बनाया गया है देता है? क्या मैन्युअल प्रारंभिक सबसेटिंग के अलावा कोई विकल्प हैं?
मेरे लैपटॉप, एक मैकबुक प्रो 2013 में है 2.4GHz 8GB
मैं समानांतर में जिसके परिणामस्वरूप सूची आइटम, यानी 'list_of_dataframes%>% नक्शा (sequentially_process_each_row_of_df) को संसाधित करना चाहते हैं' – Rickard
, पर विचार भी, '' 'df' split'ting से पहले order'ing, ताकि' .internal (विभाजन()) 'स्मृति को लगातार एक्सेस करता है -' system.time ({a = split (df, df $ x)}); system.time ({odf = df [ऑर्डर (डीएफ $ एक्स),]; बी = विभाजन (odf, odf $ x)}); समान (ए, बी) ' –
@alexis_laz वास्तव में, मेमोरी एक्सेस पैटर्न में सुधार करने के बजाए पंक्ति नाम बनाता है -' .row_names_info (df) 'और' .row_names_info (df [order (df $ x),] की तुलना करें) ' ; पहले मामले में ऋणात्मक मूल्य इंगित करता है कि पंक्ति नामों को 'सी (एनए, 1000000)' के रूप में कॉम्पैक्टली रूप से संग्रहीत किया जाता है, दूसरे मामले में सकारात्मक मूल्य जिसे वे सचमुच एक पूर्णांक वेक्टर के रूप में संग्रहीत किया जाता है। –