2015-02-22 15 views
7

próbuję nawracać, na przykład, „9¼" ” do «9.25», ale nie może wydawać się prawidłowo odczytać częśćR - Konwersja frakcji w tekst do numeryczna

Oto dane pracuję z. :

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

Jako przykład kolumna Ręce w pierwszym rzędzie jest „9¼" ”, jak chciałbym zrobić połączyć $ Ręce stają 9.25? To samo dotyczy wszystkich pozostałych frakcji 1/8 - 7/8.

Każda pomoc zostanie doceniona.

+0

możliwe duplikat [Zamiana wektor postaci mieszanych frakcji, liczb całkowitych, a Nu meric] (http://stackoverflow.com/questions/10674992/convert-a-character-vector-of-mixed-numbers-fractions-and-integers-to-numeric) – Metrics

+5

@Metrics - nie wydaje się być duplikat dla mnie, ponieważ ułamki w połączonym adresie URL są najwyraźniej zakodowane jako pojedyncze znaki (prawdopodobnie w kodzie Unicode, np. [te] (http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html#fractions)). –

+0

Cóż, jeśli * są * ułamkami unicode, to prosta tabela odnośników do mapowania wartości liczbowej unikodu do żądanej wartości liczbowej jest trywialna do wytworzenia. –

Odpowiedz

7

Można spróbować przekształcić kodowanie Unicode do ASCII bezpośrednio podczas czytania XML przy użyciu specjalnej funkcji powrotny:

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

Następnie można użyć sugestię @Metrics', aby przekształcić go do liczb.

Możesz zrobić na przykład używając @G. Funkcja Grothendiecka z this post oczyścić dane 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 

Nie może być pewne problemy kodowania w zależności od urządzenia (patrz komentarze)

+1

To interesujące, ale (przynajmniej na moim komputerze z systemem Windows 7) nie czyta we wszystkich frakcjach poprawnie. Travis Carrie (na przykład), 5 gracz w dół, ma ramiona, które mają 31 7/8 cala, ale to zostaje odczytane jako "31a ... z" '. Wygląda na to, że być może 1/4, 1/2 i 3/4 zostaną poprawnie przetłumaczone, ale nie ułamki, które są nieparzystymi wielokrotnościami 1/8. –

+1

Dziwne, jestem na MacOS, a 1/8 dobrze się nawraca, może istnieje inna funkcja 'stri', która może być użyteczna tutaj, dzięki za dodanie' biblioteki' – NicE

+0

Myślałem, że to może być problem z OS. Nigdy nie miałem okazji (lub powodu), aby naprawdę dowiedzieć się kodowania na moim komputerze z systemem Windows. Po prostu zauważam, że gdy próbuję czegoś z nimi, nie wydaje się, żeby były one szczególnie dobrze obsługiwane ... –

1

nie sądzę, to jest mądry ani wydajny w porównaniu do rozwiązań alternatywnych, ale wykorzystuje gsub zastąpić "symbol i konwersji każdą frakcję na jego dziesiętny, przed konwersją na numeryczne:

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