दिलचस्प पोस्ट
लूप के लिए जावास्क्रिप्ट के द्वारा json कैसे बनाऊँ? मैं 24 घंटे से 12 घंटे का समय कैसे बदल सकता हूं? एसटीडी नेमस्पेस में मेरा लॉग क्यों है? शांत वेब सेवा शरीर प्रारूप मेरी फ़ंक्शन किसी को क्यों नहीं लौटाता है? जावा टर्नरी (तत्काल अगर) मूल्यांकन Python 3.3 और मैक पर PyOpenSSL स्थापित करना कैसे एकल थ्रेडेड गैर अवरुद्ध IO मॉडल Node.js में काम करता है स्वत: वेतन वृद्धि के साथ mysql दो स्तंभ प्राथमिक कुंजी सुनिश्चित करें कि स्प्रिंग क्वार्ट्ज नौकरी निष्पादन ओवरलैप नहीं है Active_Record / Rails के created_at, updated_at कॉलम का नाम बदलना मेमोरी लीक सी # MySQL का प्रयोग करके तीन तालिकाओं में शामिल हो रहा है जावा वर्ग java.util.ArrayList … और MIME मीडिया प्रकार पाठ / xml के लिए एक संदेश शरीर लेखक नहीं मिला स्थिति के आधार पर एक निश्चित मार्ग पर पुनर्निर्देशित करना

जानकारी के नुकसान के बिना एक पूर्णांक \ numeric में एक कारक कैसे परिवर्तित करें?

जब मैं एक कारक को एक संख्यात्मक या पूर्णांक में कनवर्ट करता हूं, तो मुझे अंतर्निहित स्तर के कोड मिलते हैं, संख्याओं के रूप में नहीं।

f <- factor(sample(runif(5), 20, replace = TRUE)) ## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041 ## [4] 0.0284090070053935 0.363644931698218 0.363644931698218 ## [7] 0.179684827337041 0.249704354675487 0.249704354675487 ## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935 ## [13] 0.179684827337041 0.0248644019011408 0.179684827337041 ## [16] 0.363644931698218 0.249704354675487 0.363644931698218 ## [19] 0.179684827337041 0.0284090070053935 ## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218 as.numeric(f) ## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2 as.integer(f) ## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2 

वास्तविक मूल्यों को प्राप्त करने के लिए मुझे paste का सहारा है।

 as.numeric(paste(f)) ## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493 ## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901 ## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493 ## [19] 0.17968483 0.02840901 

क्या एक कारक को संख्यात्मक रूपांतरित करने का एक बेहतर तरीका है?

वेब के समाधान से एकत्रित समाधान "जानकारी के नुकसान के बिना एक पूर्णांक \ numeric में एक कारक कैसे परिवर्तित करें?"

चेतावनी अनुभाग का ?factor :

विशेष रूप से, as.numeric कि एक कारक पर लागू as.numeric अर्थहीन है, और अंतर्निहित बलात्कार से हो सकता है। एक कारक f को लगभग अपने मूल अंकीय मूल्यों में as.numeric(levels(f))[f] , as.numeric(levels(f))[f] संख्यात्मक as.numeric(levels(f))[f] की सिफारिश की जाती है और as.numeric(as.character(f))as.numeric(as.character(f)) तुलना में थोड़ा अधिक कुशल है।

आर पर पूछे जाने वाले प्रश्न की इसी तरह की सलाह है


क्यों के रूप में है। as.numeric(levels(f))[f] as.numeric(as.character(f)) से अधिक कुशल?

as.numeric(as.character(f)) प्रभावी रूप से as.numeric(levels(f)[f]) , इसलिए आप nlevels(x) मानों की बजाय, length(x) मानों पर संख्यात्मक रूपांतरण कर रहे हैं। गति के अंतर में कुछ स्तरों के साथ लंबे वैक्टर के लिए सबसे अधिक स्पष्ट होगा। यदि मूल्य अधिकतर अद्वितीय हैं, तो गति में बहुत अंतर नहीं होगा। हालांकि आप रूपांतरण करते हैं, यह ऑपरेशन आपके कोड में बाधाओं की संभावना नहीं है, इसलिए इसके बारे में बहुत ज्यादा चिंता न करें।


कुछ समय

 library(microbenchmark) microbenchmark( as.numeric(levels(f))[f], as.numeric(levels(f)[f]), as.numeric(as.character(f)), paste0(x), paste(x), times = 1e5 ) ## Unit: microseconds ## expr min lq mean median uq max neval ## as.numeric(levels(f))[f] 3.982 5.120 6.088624 5.405 5.974 1981.418 1e+05 ## as.numeric(levels(f)[f]) 5.973 7.111 8.352032 7.396 8.250 4256.380 1e+05 ## as.numeric(as.character(f)) 6.827 8.249 9.628264 8.534 9.671 1983.694 1e+05 ## paste0(x) 7.964 9.387 11.026351 9.956 10.810 2911.257 1e+05 ## paste(x) 7.965 9.387 11.127308 9.956 11.093 2419.458 1e+05 

आर कई कारकों को परिवर्तित करने के लिए (undocumented) सुविधा फ़ंक्शन हैं:

  • as.character.factor
  • as.data.frame.factor
  • as.Date.factor
  • as.list.factor
  • as.vector.factor

लेकिन annoyingly, कारक को संभाल करने के लिए कुछ भी नहीं है -> संख्यात्मक रूपांतरण यहोशू उलरिक के जवाब का एक विस्तार के रूप में, मैं अपने मुहावरे काम की परिभाषा के साथ इस चूक को दूर करने का सुझाव दूंगा:

 as.numeric.factor <- function(x) {as.numeric(levels(x))[x]} 

कि आप अपनी स्क्रिप्ट की शुरुआत में स्टोर कर सकते हैं, या आपके में भी बेहतर .Rprofile फ़ाइल

सबसे आसान तरीका पैकेज varhandle से unfactor समारोह का उपयोग करने के लिए किया जाएगा

 unfactor(your_factor_variable) 

यह उदाहरण एक त्वरित प्रारंभ हो सकता है:

 x <- rep(c("a", "b", "c"), 20) y <- rep(c(1, 1, 0), 20) class(x) # -> "character" class(y) # -> "numeric" x <- factor(x) y <- factor(y) class(x) # -> "factor" class(y) # -> "factor" library(varhandle) x <- unfactor(x) y <- unfactor(y) class(x) # -> "character" class(y) # -> "numeric" 

यह केवल तब ही मामला है जब कारक लेबल मूल मानों से मेल खाते हैं। मैं इसे उदाहरण के साथ समझाऊंगा

मान लें कि डेटा सदिश है x :

 x <- c(20, 10, 30, 20, 10, 40, 10, 40) 

अब मैं चार लेबल के साथ एक कारक बनाएगा:

 f <- factor(x, levels = c(10, 20, 30, 40), labels = c("A", "B", "C", "D")) 

1) x टाइप डबल के साथ है, f टाइप पूर्णांक के साथ है यह जानकारी की पहली अपरिहार्य हानि है कारक हमेशा पूर्णांक के रूप में संग्रहित होते हैं

 > typeof(x) [1] "double" > typeof(f) [1] "integer" 

2) मूल मूल्यों (10, 20, 30, 40) को केवल वापस उपलब्ध करना संभव नहीं है हम देख सकते हैं कि f 1, 2, 3, 4 और दो विशेषताओं – लेबल्स की सूची ("ए", "बी", "सी", "डी") और वर्ग विशेषता "कारक" और कुछ नहीं।

 > str(f) Factor w/ 4 levels "A","B","C","D": 2 1 3 2 1 4 1 4 > attributes(f) $levels [1] "A" "B" "C" "D" $class [1] "factor" 

मूल मूल्यों में वापस लौटने के लिए हमें कारक बनाने में उपयोग किए गए स्तरों के मूल्यों को जानना होगा। इस मामले में c(10, 20, 30, 40) । अगर हम मूल स्तर (सही क्रम में) जानते हैं, तो हम मूल मानों में वापस लौट सकते हैं।

 > orig_levels <- c(10, 20, 30, 40) > x1 <- orig_levels[f] > all.equal(x, x1) [1] TRUE 

और यह केवल तभी काम करेगा जब मूल डेटा में लेबल के सभी संभावित मानों के लिए परिभाषित किया गया हो।

इसलिए यदि आपको मूल मूल्यों की आवश्यकता होगी, तो आपको उन्हें रखना होगा। अन्यथा एक उच्च मौका है कि उन्हें केवल एक कारक से वापस पाने के लिए संभव नहीं होगा।

इस पद के हर जवाब मेरे लिए परिणाम उत्पन्न करने में विफल रहे, एनएएस उत्पन्न हो रहे थे।

 y2<-factor(c("A","B","C","D","A")); as.numeric(levels(y2))[y2] [1] NA NA NA NA NA Warning message: NAs introduced by coercion 

मेरे लिए क्या काम है यह –

 library(magrittr) unclass(y2) %>% as.numeric [1] 1 2 3 4 1