2015-02-22 9 views
7

Sto cercando di convertire, ad esempio, '9 ¼" ' a '9.25', ma non riesco a leggere la frazione correttamenteR - Conversione di frazioni in testo a numerico

Ecco i dati con cui sto lavorando. :

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") 

a titolo di esempio, la colonna mani in prima fila è '9 ¼" ', come potrei fare combinano $ mani diventano 9.25? Lo stesso per tutte le altre frazioni 1/8 - 7/8.

Qualsiasi aiuto sarebbe apprezzato.

+0

possibile duplicato di [Converti un vettore di carattere misto numeri, frazioni e interi a nu meric] (http://stackoverflow.com/questions/10674992/convert-a-character-vector-of-mixed-numbers-fractions-and-integers-to-ericum) – Metrics

+5

@Metrics - Non sembra essere un duplicato per me, poiché le frazioni dell'URL collegato sono apparentemente codificate come singoli caratteri (possibilmente in Unicode come, ad esempio, [questi] (http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html#fractions)). –

+0

Bene, se * sono * frazioni unicode, allora una semplice tabella di ricerca per mappare il valore intero di unicode sul valore numerico desiderato è banale da produrre. –

risposta

7

Si può cercare di trasformare la codifica unicode in ASCII direttamente durante la lettura del codice XML utilizzando una funzione speciale di ritorno:

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

È quindi possibile utilizzare il suggerimento @Metrics' per convertirlo in numeri.

Ad esempio, è possibile utilizzare @G. la funzione di Grothendieck da this post ripulire i dati 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 

ci potrebbero essere alcuni problemi di codifica a seconda della vostra macchina (vedi i commenti)

+1

Questo è interessante, ma (almeno sul mio computer Windows 7) non legge correttamente tutte le frazioni. Travis Carrie (per esempio), il quinto giocatore in giu, ha braccia che sono 31 7/8 ", ma che viene letta come" 31a ... z "'. Sembra che forse 1/4, 1/2 e 3/4 vengano tradotti correttamente, ma non frazioni che sono multipli dispari di 1/8. –

+1

Strano, sono su MacOS e 1/8 viene convertito bene, forse c'è un'altra funzione di 'stri' che potrebbe essere utile qui, grazie per l'aggiunta della' libreria' – NicE

+0

Pensato che potrebbe essere un problema del sistema operativo. Non ho mai avuto occasione (o ragione) per capire veramente le codifiche sulla mia macchina Windows. Ho appena notato ogni volta che provo qualcosa con loro, che non sembrano essere gestiti particolarmente bene ... –

1

non credo che questo è intelligente ed efficiente rispetto alle alternative, ma questo utilizza gsub per sostituire il "simbolo e convertire ogni frazione alla sua decimale, prima della conversione in numerico:

#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) 
Problemi correlati