दिलचस्प पोस्ट
एंड्रॉइड: Google सर्वर का उपयोग किए बिना भाषण मान्यता आंशिक रूप से nHibernate में कई क्षेत्रों के साथ एक बच्चे ऑब्जेक्ट कैसे प्रोजेक्ट करें एचटीएमएल सामग्री को वीबीए में पार्स करें किसी बच्चे को अगर किसी अन्य डोमेन से अपनी मूल विंडो पर किसी फ़ंक्शन को कॉल करने के लिए अनुमति देता है ग्रुपिंग के साथ WPF DataGrid वर्चुअलाइजेशन पीआईपी कनेक्शन विफलता: इंडेक्स बेस यूआरएल को नहीं लाया जा सकता http://pypi.python.org/simple/ एक्सएमएल स्ट्रिंग में सफेद स्थान निकालें क्या लिनक्स पर "विशेषाधिकारित" बंदरगाहों को बाइंड करने के लिए गैर रूट प्रक्रियाओं का कोई तरीका है? किसी अन्य कॉलम से सशर्त बयान के आधार पर डेटाफ्रेम में एक कारक स्तंभ कैसे जोड़ सकता है? सी में एक स्टैक ट्रेस कैसे पकड़ सकता है? क्या हम एक तालिका के प्राथमिक कुंजी मूल्यों को अपडेट कर सकते हैं? जावास्क्रिप्ट में ब्राउजर वर्ण का समर्थन पता? jquery चेक अगर यह क्लिक किया है या नहीं मैं PHP में पाठ से रिक्त पंक्ति कैसे निकालूं? मैं DataReader को आसानी से <T> कैसे परिवर्तित कर सकता हूं?

अल्पविराम से अलग किए गए कॉलम अलग पंक्तियों में विभाजित करें

मेरे पास एक डेटा फ्रेम है, जैसे:

data.frame(director = c("Aaron Blaise,Bob Walker", "Akira Kurosawa", "Alan J. Pakula", "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu", "Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu", "Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock", "Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik", "Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson", "Anne Fontaine", "Anthony Harvey"), AB = c('A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'A')) 

जैसा कि आप देख सकते हैं, director कॉलम में कुछ प्रविष्टियाँ कॉमा द्वारा अलग किए गए कई नाम हैं। मैं अन्य प्रविष्टियों के मूल्यों को बनाए रखते हुए इन प्रविष्टियों को अलग-अलग पंक्तियों में विभाजित करना चाहता हूं। एक उदाहरण के रूप में, ऊपर दिए गए डेटा फ्रेम की पहली पंक्ति दो पंक्तियों में विभाजित की जानी चाहिए, प्रत्येक एक director कॉलम में एक नाम के साथ और AB कॉलम में 'ए'।

Solutions Collecting From Web of "अल्पविराम से अलग किए गए कॉलम अलग पंक्तियों में विभाजित करें"

यह पुराने प्रश्न अक्सर धोखा लक्ष्य ( r-faq साथ टैग) के रूप में इस्तेमाल किया जा रहा है। आज के तौर पर, इसे 6 अलग-अलग तरीकों की पेशकश के तीन बार उत्तर दिया गया है, लेकिन मार्गदर्शन के रूप में एक बेंचमार्क की कमी है, जो दृष्टिकोण के सबसे तेज 1 है

बेंचमार्क समाधान में शामिल हैं

  • मैथ्यू लुंडबर्ग का आधार आर दृष्टिकोण लेकिन रिच स्क्रिप्वर की टिप्पणी के अनुसार संशोधित,
  • जैप के दो data.table तरीके और दो dplyr / tidyr दृष्टिकोण,
  • आनंद के splitstackshape समाधान ,
  • और जैप के data.table तरीकों के दो अतिरिक्त संस्करण।

microbenchmark पैकेज का उपयोग करके 6 अलग-अलग आकार के डेटा फ़्रेमों पर कुल 8 अलग-अलग तरीकों को बेंचमार्क किया गया था (नीचे कोड देखें)।

ओपी द्वारा दिए गए नमूना डेटा में केवल 20 पंक्तियाँ होती हैं। बड़ा डेटा फ्रेम बनाने के लिए, इन 20 पंक्तियों को 1, 10, 100, 1000, 10000, और 100000 बार दोहराया जाता है, जो 2 मिलियन पंक्तियों तक समस्या आकार देते हैं।

बेंचमार्क परिणाम

यहां छवि विवरण दर्ज करें

बेंचमार्क परिणाम यह दर्शाते हैं कि पर्याप्त डेटा डेटा के लिए सभी डेटा data.table तरीके किसी भी अन्य विधि से अधिक तेज़ हैं। लगभग 5000 पंक्तियों के साथ डेटा फ़्रेम के लिए, जॅप की data.table विधि 2 और संस्करण DT3 सबसे तेज़ हैं, धीमे तरीकों की तुलना में तेज़ गति।

उल्लेखनीय रूप से, दो tidyverse तरीके और splistackshape समाधान के समय इतने समान हैं कि चार्ट में घटता splistackshape मुश्किल है। वे सभी डेटा फ्रेम आकारों में बेंचमार्क वाले तरीकों की सबसे धीमी गति से हैं

छोटे डेटा फ़्रेमों के लिए, मैट के बेस आर समाधान और data.table विधि 4 में अन्य विधियों की तुलना में कम उपरि है।

कोड

 director <- c("Aaron Blaise,Bob Walker", "Akira Kurosawa", "Alan J. Pakula", "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu", "Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu", "Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock", "Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik", "Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson", "Anne Fontaine", "Anthony Harvey") AB <- c("A", "B", "A", "A", "B", "B", "B", "A", "B", "A", "B", "A", "A", "B", "B", "B", "B", "B", "B", "A") library(data.table) library(magrittr) 

समस्या का आकार n बेंचमार्क रन के लिए फ़ंक्शन परिभाषित करें

 run_mb <- function(n) { # compute number of benchmark runs depending on problem size `n` mb_times <- scales::squish(10000L / n , c(3L, 100L)) cat(n, " ", mb_times, "\n") # create data DF <- data.frame(director = rep(director, n), AB = rep(AB, n)) DT <- as.data.table(DF) # start benchmarks microbenchmark::microbenchmark( matt_mod = { s <- strsplit(as.character(DF$director), ',') data.frame(director=unlist(s), AB=rep(DF$AB, lengths(s)))}, jaap_DT1 = { DT[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by = AB ][!is.na(director)]}, jaap_DT2 = { DT[, strsplit(as.character(director), ",", fixed=TRUE), by = .(AB, director)][,.(director = V1, AB)]}, jaap_dplyr = { DF %>% dplyr::mutate(director = strsplit(as.character(director), ",")) %>% tidyr::unnest(director)}, jaap_tidyr = { tidyr::separate_rows(DF, director, sep = ",")}, cSplit = { splitstackshape::cSplit(DF, "director", ",", direction = "long")}, DT3 = { DT[, strsplit(as.character(director), ",", fixed=TRUE), by = .(AB, director)][, director := NULL][ , setnames(.SD, "V1", "director")]}, DT4 = { DT[, .(director = unlist(strsplit(as.character(director), ",", fixed = TRUE))), by = .(AB)]}, times = mb_times ) } 

विभिन्न समस्या आकारों के लिए बेंचमार्क चलाएं

 # define vector of problem sizes n_rep <- 10L^(0:5) # run benchmark for different problem sizes mb <- lapply(n_rep, run_mb) 

प्लॉटिंग के लिए डेटा तैयार करें

 mbl <- rbindlist(mb, idcol = "N") mbl[, n_row := NROW(director) * n_rep[N]] mba <- mbl[, .(median_time = median(time), N = .N), by = .(n_row, expr)] mba[, expr := forcats::fct_reorder(expr, -median_time)] 

चार्ट बनाएं

 library(ggplot2) ggplot(mba, aes(n_row, median_time*1e-6, group = expr, colour = expr)) + geom_point() + geom_smooth(se = FALSE) + scale_x_log10(breaks = NROW(director) * n_rep) + scale_y_log10() + xlab("number of rows") + ylab("median of execution time [ms]") + ggtitle("microbenchmark results") + theme_bw() 

सत्र जानकारी और पैकेज संस्करण (अंश)

 devtools::session_info() #Session info # version R version 3.3.2 (2016-10-31) # system x86_64, mingw32 #Packages # data.table * 1.10.4 2017-02-01 CRAN (R 3.3.2) # dplyr 0.5.0 2016-06-24 CRAN (R 3.3.1) # forcats 0.2.0 2017-01-23 CRAN (R 3.3.2) # ggplot2 * 2.2.1 2016-12-30 CRAN (R 3.3.2) # magrittr * 1.5 2014-11-22 CRAN (R 3.3.0) # microbenchmark 1.4-2.1 2015-11-25 CRAN (R 3.3.3) # scales 0.4.1 2016-11-09 CRAN (R 3.3.2) # splitstackshape 1.4.2 2014-10-23 CRAN (R 3.3.3) # tidyr 0.6.1 2017-01-10 CRAN (R 3.3.2) 

1 मेरी जिज्ञासा इस विपुल टिप्पणी से शानदार दिख रही थी शानदार! तीव्रता के आदेश तेज! इस प्रश्न का एक डुप्लिकेट के रूप में बंद किया गया एक प्रश्न का एक tidyverse उत्तर के लिए।

कई विकल्प:

1) data.table साथ दो तरीके data.table :

 library(data.table) # method 1 (preferred) setDT(v)[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by = AB ][!is.na(director)] # method 2 setDT(v)[, strsplit(as.character(director), ",", fixed=TRUE), by = .(AB, director) ][,.(director = V1, AB)] 

2) एक dplyr / tidyr संयोजन: वैकल्पिक रूप से, आप भी dplyr / tidyr संयोजन का उपयोग कर सकते हैं:

 library(dplyr) library(tidyr) v %>% mutate(director = strsplit(as.character(director), ",")) %>% unnest(director) 

3) केवल tidyr साथ: tidyr 0.5.0 (और बाद में) के साथ, आप केवल tidyr 0.5.0 का भी उपयोग कर सकते हैं:

 separate_rows(v, director, sep = ",") 

4) आधार आर के साथ:

 # if 'director' is a character-column: stack(setNames(strsplit(df$director,','), df$AB)) # if 'director' is a factor-column: stack(setNames(strsplit(as.character(df$director),','), df$AB)) 

अपने मूल डेटा का नाम देना। फ्रेम v , हमारे पास यह है:

 > s <- strsplit(as.character(v$director), ',') > data.frame(director=unlist(s), AB=rep(v$AB, sapply(s, FUN=length))) director AB 1 Aaron Blaise A 2 Bob Walker A 3 Akira Kurosawa B 4 Alan J. Pakula A 5 Alan Parker A 6 Alejandro Amenabar B 7 Alejandro Gonzalez Inarritu B 8 Alejandro Gonzalez Inarritu B 9 Benicio Del Toro B 10 Alejandro González Iñárritu A 11 Alex Proyas B 12 Alexander Hall A 13 Alfonso Cuaron B 14 Alfred Hitchcock A 15 Anatole Litvak A 16 Andrew Adamson B 17 Marilyn Fox B 18 Andrew Dominik B 19 Andrew Stanton B 20 Andrew Stanton B 21 Lee Unkrich B 22 Angelina Jolie B 23 John Stevenson B 24 Anne Fontaine B 25 Anthony Harvey A 

नया अटल बिहारी स्तंभ बनाने के लिए rep का उपयोग ध्यान दें। यहां, प्रत्येक मूल पंक्तियों में नामों की संख्या वापस आती है

पार्टी के लिए देर हो गई, लेकिन एक अन्य सामान्य विकल्प मेरे "स्प्लिटस्टाशेप" पैकेज से cSplit का उपयोग cSplit है जो कि direction तर्क है। आप निर्दिष्ट परिणाम प्राप्त करने के लिए इसे "long" पर सेट करें:

 library(splitstackshape) head(cSplit(mydf, "director", ",", direction = "long")) # director AB # 1: Aaron Blaise A # 2: Bob Walker A # 3: Akira Kurosawa B # 4: Alan J. Pakula A # 5: Alan Parker A # 6: Alejandro Amenabar B