2015-02-22 22 views
7
Sayısal

için Metin Kesirler dönüştürme, '9¼" ' için '9.25' ancak doğru kısmını okumak gibi olamazR - örneğin, ben dönüştürmek çalışıyorum

İşte çalışıyorum veri var. :

örnek olarak
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") 

, ilk satırda Eller sütundur '9¼" ', nasıl $ birleştirmek yapmak Eller 9.25 olacak? Diğer tüm fraksiyonlar için aynıdır 1/8 - 7/8.

Herhangi bir yardım için teşekkür ederiz.

+0

olası yinelenen nu için karışık sayılar, kesirler ve tamsayılar bir karakter vektör dönüştürme meric] (http://stackoverflow.com/questions/10674992/convert-a-character-vector-of-mixed-numbers-fractions-and-integers-to-numeric) – Metrics

+5

@Metrics - Görünmüyor Bana bir kopya, bağlantılı URL'deki kesirler görünüşte tekil karakterler olarak kodlanmış olduğundan (muhtemelen Unicode gibi, örneğin, [bunlar] (http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html#fractions)). –

+0

Eğer * * unicode kesirleri ise, o zaman unicode'un tamsayı değerini istenen sayısal değere eşlemek için basit bir arama tablosu üretmek önemsizdir. –

cevap

7

Özel bir dönüş fonksiyonu kullanılarak XML okurken doğrudan ASCII Unicode kodlamayı dönüştürmeye deneyebilirsiniz: Daha sonra sayılara dönüştürmek için @Metrics' öneriyi kullanabilirsiniz

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

. Örneğin, @ G kullanarak yapabilirsiniz. this post den Grothendieck fonksiyonu Arms verilerini temizlemek:

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 

Bazı kodlama sorunları makinenizde bağlı

+1

Bu ilginç, ancak (en azından Windows 7 bilgisayarımda) tüm kesirlerde doğru okumuyor. Travis Carrie (örneğin), 5. oyuncu aşağı, 31 7/8 "olan kolları var, ama bu 31a ... z" olarak okur. Belki de 1/4, 1/2 ve 3/4 doğru bir şekilde çevrilmiş gibi görünüyor, ancak 1/8'lik tek katları olan kesirler değil. –

+1

Garip, MacOS'tayım ve 1/8 para cezası alınıyor, belki de burada kullanılabilecek başka bir fonksiyon var, 'kütüphane' – NicE

+0

eklemek için teşekkürler Bir OS sorunu olabileceğini düşündüm. Windows makinemde kodlamaları gerçekten anlayabilmek için hiçbir zaman (veya sebep) yaşadım. Onlarla bir şey denediğimde fark ettim, özellikle iyi işlenmiş gibi görünmüyorlar ... –

1

bu alternatiflere göre zeki veya verimli olduğunu düşünmüyorum (yorumlara bakınız) olabilir, ancak bu sayısal dönüştürmeden önce, "sembolünü değiştirmek ve ondalık her kısmını dönüştürmek için gsub kullanır: [içinde

#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) 
İlgili konular