दिलचस्प पोस्ट
अजगर – अजीब / यहां तक ​​की संख्याओं की जांच करना और नंबर आकार पर आउटपुट को बदलना मैं एक सॉल्टर / ल्यूसीन स्कोर कैसे सामान्य कर सकता हूं? आप एक वीकएचशैप या कमजोर का उपयोग कब करेंगे? आप आरएक्सजेवा में मानचित्र बनाम फ्लैटमैप कब उपयोग करते हैं? एनएसडीट की शुरुआत और दिन की समाप्ति कौन सा ECMAScript 6 सुविधाएं सख्त मोड दर्शाती हैं? प्लगिंग लाइन और जीजीप्लोट 2 में समूह सौंदर्य मैं इसे कैसे कस्टम ऑब्जेक्ट के साथ एक NSMutableArray सॉर्ट कर सकता हूँ? <मॉड्यूल रनअल्म मैनेजमेंटमॉडल्सफॉरएरेआरक्वॉस्ट्स = "सच्चा" /> अर्थ एकाधिक मॉड्यूल में पायथन लॉगिंग का उपयोग करना जीसीसी में सी ++ 11 को कैसे सक्षम कर सकता हूं? Php के strtotime () के जावास्क्रिप्ट समकक्ष? माउस को "क्लिक" और "ड्रैग" में अंतर कैसे करें एक्लिप्स के लिए जेवीएम अधिकतम हेप आकार बढ़ाएं एंड्रॉइड: कम मेमोरी पर स्टैटिक वेरिएबल नाल

खूबसूरत ढंग से (डेटा) में कई स्तंभों को सुशोभित करना

मैं उपयोग करने का एक शानदार तरीका data.table कोशिश कर रहा हूं := साझा किए गए फ़ंक्शन को लागू करके किसी data.table में एक बार में कई स्तंभों को प्रतिस्थापित करने के लिए असाइनमेंट। इसका एक सामान्य उपयोग एक स्ट्रिंग फ़ंक्शन (उदाहरण के लिए, gsub ) को किसी तालिका में सभी वर्ण स्तंभों पर लागू करने के लिए हो सकता है। यह data.frame लिए data.frame करने के लिए data.framedata.frame पद्धति का विस्तार करना मुश्किल नहीं है, लेकिन मैं data.table करने data.table तरीके के अनुरूप एक विधि की तलाश कर रहा हूं।

उदाहरण के लिए:

 library(data.table) m <- matrix(runif(10000), nrow = 100) df <- df1 <- df2 <- df3 <- as.data.frame(m) dt <- as.data.table(df) head(names(df)) head(names(dt)) ## replace V20-V100 with sqrt # data.frame approach # by column numbers df1[20:100] <- lapply(df1[20:100], sqrt) # by reference to column numbers v <- 20:100 df2[v] <- lapply(df2[v], sqrt) # by reference to column names n <- paste0("V", 20:100) df3[n] <- lapply(df3[n], sqrt) # data.table approach # by reference to column names n <- paste0("V", 20:100) dt[, n] <- lapply(dt[, n, with = FALSE], sqrt) 

मैं समझता हूं कि यह स्तंभ नामों के एक वेक्टर पर लूप के लिए और अधिक कुशल है := असाइन करने के लिए:

 for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE] 

मुझे यह पसंद नहीं है क्योंकि मुझे data.table की data.table j अभिव्यक्ति में संदर्भ पसंद नहीं है I मुझे यह भी पता है कि मैं उपयोग कर सकते हैं := lapply साथ असाइन करने के लिए कि मैं कॉलम नाम जानता हूँ:

 dt[, c("V20", "V30", "V40", "V50", "V60") := lapply(list(V20, V30, V40, V50, V60), sqrt)] 

(आप अज्ञात स्तंभ नामों के साथ एक अभिव्यक्ति के निर्माण के द्वारा इसका विस्तार कर सकते हैं।)

नीचे दिए गए विचारों पर मैं इस पर कोशिश कर रहा था, लेकिन मैं उन्हें काम करने में सक्षम नहीं था। क्या मैं गलती कर रहा हूं, या क्या मुझे याद आ रही है?

 # possible data.table approaches? # by reference to column names; assignment works, but not lapply n <- paste0("V", 20:100) dt[, n := lapply(n, sqrt), with = FALSE] # by (smaller for example) list; lapply works, but not assignment dt[, list(list(V20, V30, V40, V50, V60)) := lapply(list(V20, V30, V40, V50, V60), sqrt)] # by reference to list; neither assignment nor lapply work l <- parse(text = paste("list(", paste(paste0("V", 20:100), collapse = ", "), ")")) dt[, eval(l) := lapply(eval(l), sqrt)] 

Solutions Collecting From Web of "खूबसूरत ढंग से (डेटा) में कई स्तंभों को सुशोभित करना"

हां, आप यहां प्रश्न में सही हैं:

मैं समझता हूं कि यह स्तंभ नामों के एक वेक्टर पर लूप के लिए और अधिक कुशल है := असाइन करने के लिए:

for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE]

एक तरफ: ध्यान रखें कि यह करने का नया तरीका है:

 for (col in paste0("V", 20:100)) dt[ , (col) := sqrt(dt[[col]])] 

क्योंकि with = FALSE के with = FALSE यह पढ़ना आसान नहीं था कि क्या यह एलएचएस या आरएचएस := संदर्भ में है। एक तरफ अंत

जैसा कि आप जानते हैं, यह कुशल है क्योंकि प्रत्येक कॉलम एक-एक करके करता है, इसलिए एक समय में केवल एक कॉलम के लिए काम करने की मेमोरी आवश्यक है। इससे काम करने में अंतर हो सकता है और यह खतरनाक आउट-ऑफ-मेमोरी त्रुटि से असफल हो सकता है

आरएचएस := पर lapply साथ समस्या यह है कि आरएचएस ( lapply ) का मूल्यांकन पहले किया जाता है; यानी, 80 कॉलम के लिए परिणाम बनाया गया है। यह 80 कॉलम की नई मेमोरी की कीमत है जिसे आवंटित और आबादी की जानी है। तो आपको सफल होने के लिए उस ऑपरेशन के लिए 80 कॉलम की मुफ्त रैम की आवश्यकता होती है। उस रैम का उपयोग डाटा के योग्य कॉलम पॉइंटर स्लॉट्स में उन 80 नए कॉलमों को निर्दिष्ट करने ( plonking ) के तत्काल तत्काल संचालन पर बनाम बनाता है।

@ फ्रैंक की ओर इशारा करते हैं, अगर आपके पास बहुत से कॉलम हैं (10,000 या अधिक बोलें) तो [.data.table विधि को जोड़ने के लिए छोटे उपरि जोड़ना शुरू होता है)। उस ओवरहेड को खत्म करने के लिए कि data.table::set जिसके तहत ?set " ?set को " data.table::set " के रूप में वर्णित किया गया है := । मैं इस प्रकार के ऑपरेशन के for लूप का उपयोग करता हूं I यह सबसे तेज़ तरीका है और लिखना और पढ़ना काफी आसान है।

 for (col in paste0("V", 20:100)) set(dt, j = col, value = sqrt(dt[[col]])) 

यद्यपि सिर्फ 80 कॉलमों के साथ, यह बात करने की संभावना नहीं है (ध्यान दें कि बड़ी संख्या में कॉलम की तुलना में बड़ी संख्या में पंक्तियों पर set लूप के लिए और अधिक सामान्य हो सकता है।) हालांकि, set रोका गया set प्रश्न में उल्लेखित dt प्रतीक नाम के दोहराव वाले संदर्भ की समस्या को हल नहीं करता है:

मुझे यह पसंद नहीं है क्योंकि मुझे एजे एक्सप्रेशन में डेटा के लिए संदर्भ पसंद नहीं है।

माना। तो सबसे अच्छा मैं कर सकता हूँ आपके पाशन की ओर लौटा है := लेकिन इसके बजाय उपयोग करें।

 for (col in paste0("V", 20:100)) dt[, (col) := sqrt(get(col))] 

हालांकि, मुझे डर है कि j में get का उपयोग अक्षम हो सकता है। उस पर बेंचमार्किंग की आवश्यकता, # 1380 इसके अलावा, शायद यह आरएचएस पर get() का उपयोग करने के लिए भ्रामक है, लेकिन एलएचएस पर नहीं। यह पता करने के लिए कि हम एलएचएस को चीनी बना सकते हैं और साथ ही get() कर सकते हैं, # 1381 :

 for (col in paste0("V", 20:100)) dt[, get(col) := sqrt(get(col))] 

इसके अलावा, शायद set value DT दायरे में चलाया जा सकता है, # 1382

 for (col in paste0("V", 20:100)) set(dt, j = col, value = sqrt(get(col)) 

यदि आप कॉलम को स्ट्रिंग नाम से संदर्भित करना चाहते हैं, तो ये काम करना चाहिए:

 n = paste0("V", 20:100) dt[, (n) := lapply(n, function(x) {sqrt(get(x))})] 

या

 dt[, (n) := lapply(n, function(x) {sqrt(dt[[x]])})] 

क्या यह वही है आप जिसकी तलाश में हैं?

 dt[ , names(dt)[20:100] :=lapply(.SD, function(x) sqrt(x) ) , .SDcols=20:100] 

मैंने सुना है कि .SD का इस्तेमाल करना इतनी कुशल नहीं है क्योंकि इससे पहले तालिका की एक प्रतिलिपि बनायी जाती है, लेकिन अगर आपकी मेज बड़ी नहीं है (जाहिर है कि आपके सिस्टम के चश्मे के आधार पर यह रिश्तेदार है) मुझे संदेह है कि यह बहुत ज्यादा फर्क पड़ेगा