2015-02-22 7 views
7

पाठ में भिन्न परिवर्तित मैं कन्वर्ट करने के लिए कोशिश कर रहा हूँ, उदाहरण के लिए, '9¼ "' को '9.25' लेकिन अंश सही ढंग से पढ़ने के लिए नहीं कर पा रहेआर - करने के लिए संख्यात्मक

यहाँ डेटा के साथ मैं काम कर रहा हूँ है। :

library(XML) 

url <- paste("http://mockdraftable.com/players/2014/", sep = "") 
combine <- readHTMLTable(url,which=1, header=FALSE, stringsAsFactors=F) 

names(combine) <- c("Name", "Pos", "Hght", "Wght", "Arms", "Hands", 
        "Dash40yd", "Dash20yd", "Dash10yd", "Bench", "Vert", "Broad", 
        "Cone3", "ShortShuttle20") 

उदाहरण के लिए, पहली पंक्ति में हाथ स्तंभ है '9¼ "', मैं कैसे $ गठबंधन बनाना होगा हाथ 9.25 हो गए हैं? अन्य सभी अंशों के लिए 1/8 - 7/8।

किसी भी मदद की सराहना की जाएगी।

+0

[के संभावित डुप्लिकेट मिश्रित संख्या, भिन्न, और न्यू को पूर्णांकों का एक चरित्र वेक्टर कन्वर्ट मेरिक] (http://stackoverflow.com/questions/10674992/convert-a-character-vector-of-mixed-numbers-fractions-and-integers-to-numeric) – Metrics

+5

@ मेट्रिक्स - ऐसा प्रतीत नहीं होता मेरे लिए एक डुप्लिकेट, क्योंकि लिंक किए गए यूआरएल के अंश स्पष्ट रूप से अलग-अलग अक्षरों के रूप में एन्कोड किए जाते हैं (संभवतः यूनिकोड जैसे, उदाहरण के लिए, [इन] (http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html#fractions))। –

+0

ठीक है, अगर वे * यूनिकोड भिन्न होते हैं, तो वांछित संख्यात्मक मान पर यूनिकोड के पूर्णांक मान को मैप करने के लिए एक साधारण लुकअप तालिका उत्पादन के लिए तुच्छ है। –

उत्तर

7

आप जब एक्सएमएल एक विशेष वापसी समारोह का उपयोग कर पढ़ने सीधे ASCII करने के लिए यूनिकोड एन्कोडिंग को बदलने के लिए कोशिश कर सकते हैं:

library(stringi) 
readHTMLTable(url,which=1, header=FALSE, stringsAsFactors=F,elFun=function(node) { 
     val = xmlValue(node); stri_trans_general(val,"latin-ascii")}) 

फिर आप @Metrics 'सुझाव का उपयोग कर सकते यह संख्या में बदलने के लिए।

उदाहरण के लिए, आप @ जी का उपयोग कर सकते हैं। this post से Grothendieck के समारोह Arms डेटा को साफ:

library(XML) 
library(stringi) 
library(gsubfn) 
#the calc function is by @G. Grothendieck 
calc <- function(s) { 
     x <- c(if (length(s) == 2) 0, as.numeric(s), 0:1) 
     x[1] + x[2]/x[3] 
} 

url <- paste("http://mockdraftable.com/players/2014/", sep = "") 

combine<-readHTMLTable(url,which=1, header=FALSE, stringsAsFactors=F,elFun=function(node) { 
     val = xmlValue(node); stri_trans_general(val,"latin-ascii")}) 

names(combine) <- c("Name", "Pos", "Hght", "Wght", "Arms", "Hands", 
        "Dash40yd", "Dash20yd", "Dash10yd", "Bench", "Vert", "Broad", 
        "Cone3", "ShortShuttle20") 

sapply(strapplyc(gsub('\"',"",combine$Arms), "\\d+"), calc) 

#[1] 30.000 31.500 30.000 31.750 31.875 29.875 31.000 31.000 30.250 33.000 32.500 31.625 32.875 

हो सकती है कुछ एन्कोडिंग मुद्दों आपकी मशीन पर निर्भर करता है (टिप्पणी देखें)

+1

यह दिलचस्प है, लेकिन (कम से कम मेरे विंडोज 7 कंप्यूटर पर) सभी भिन्नताओं में सही ढंग से नहीं पढ़ता है। ट्रैविस कैरी (उदाहरण के लिए), 5 वें खिलाड़ी के नीचे, हथियार हैं जो 31 7/8 "हैं, लेकिन इसे '31 ए ... जेड' के रूप में पढ़ा जाता है। ऐसा लगता है कि शायद 1/4, 1/2, और 3/4 सही ढंग से अनुवादित हो जाएं, लेकिन ऐसे अंश नहीं जो 1/8 के अजीब गुणक हैं। –

+1

अजीब, मैं मैकोज़ पर हूं और 1/8 ठीक रूपांतरित हो जाता है, हो सकता है कि 'स्ट्राइ' का एक और फ़ंक्शन है जिसका उपयोग यहां किया जा सकता है, 'लाइब्रेरी' – NicE

+0

जोड़ने के लिए धन्यवाद यह सोचा कि यह एक ओएस मुद्दा हो सकता है। मेरे विंडोज मशीन पर एन्कोडिंग को वास्तव में समझने के लिए मुझे अवसर (या कारण) कभी नहीं मिला है। मैं बस ध्यान देता हूं जब भी मैं उनके साथ कुछ कोशिश करता हूं, कि उन्हें विशेष रूप से अच्छी तरह से संभाला नहीं जा रहा है ... –

1

मुझे नहीं लगता कि यह विकल्पों की तुलना में चतुर या कुशल है, लेकिन इस सांख्यिक को परिवर्तित करने से पहले "प्रतीक की जगह और उसके दशमलव करने के लिए प्रत्येक अंश कन्वर्ट करने के लिए, gsub उपयोग करता है:

#data (I've not downloaded XML for this, so maybe the encoding will make a difference?) 
combine = data.frame(Hands = c('1"','1⅛"','1¼"','1⅜"','1½"','1⅝"','1¾"','1⅞"')) 

#remove the " 
combine$Hands = gsub('"', '', combine$Hands) 

#replace each fraction with its decimal form 
combine$Hands = gsub("⅛", ".125", combine$Hands) 
combine$Hands = gsub("¼", ".25", combine$Hands) 
combine$Hands = gsub("⅜", ".375", combine$Hands) 
combine$Hands = gsub("½", ".5", combine$Hands) 
combine$Hands = gsub("⅝", ".625", combine$Hands) 
combine$Hands = gsub("¾", ".75", combine$Hands) 
combine$Hands = gsub("⅞", ".875", combine$Hands) 


combine$Hands <- as.numeric(combine$Hands) 
संबंधित मुद्दे

 संबंधित मुद्दे