2016-07-26 7 views
1

Ich weiß, diese Frage viele Male (Converting Character to Numeric without NA Coercion in R, Converting Character\Factor to Numeric without NA Coercion in R, etc.), aber ich kann nicht scheinen, um herauszufinden, was los ist in diesem speziellen Fall (Warnmeldung gefragt wurde: NAs eingeführt durch Zwang). Hier sind einige reproduzierbare Daten, mit denen ich arbeite.Convert Zeichen in numerischen ohne NA in r

#dependencies 
library(rvest) 
library(dplyr) 
library(pipeR) 
library(stringr) 
library(translateR) 

#scrape data from website 
url <- "http://irandataportal.syr.edu/election-data" 
ir.pres2014 <- url %>% 
    read_html() %>% 
    html_nodes(xpath='//*[@id="content"]/div[16]/table') %>% 
    html_table(fill = TRUE) 
ir.pres2014<-ir.pres2014[[1]] 
colnames(ir.pres2014)<-c("province","Rouhani","Velayati","Jalili","Ghalibaf","Rezai","Gharazi") 
ir.pres2014<-ir.pres2014[-1,] 

#Get rid of unnecessary rows 
ir.pres2014<-ir.pres2014 %>% 
    subset(province!="Votes Per Candidate") %>% 
    subset(province!="Total Votes") 

#Get rid of commas 
clean_numbers = function (x) str_replace_all(x, '[, ]', '') 
ir.pres2014 = ir.pres2014 %>% mutate_each(funs(clean_numbers), -province) 

#remove any possible whitespace in string 
no_space = function (x) gsub(" ","", x) 
ir.pres2014 = ir.pres2014 %>% mutate_each(funs(no_space), -province) 

Dies ist, wo Dinge für mich falsch laufen. Ich habe jede der folgenden Codezeilen ausprobiert, aber jedes Mal habe ich alle NAs bekommen. Zum Beispiel beginne ich durch den Versuch, die zweite Spalte (Rouhani) in numerischen zu konvertieren:

#First check class of vector 
class(ir.pres2014$Rouhani) 

#convert character to numeric 

ir.pres2014$Rouhani.num<-as.numeric(ir.pres2014$Rouhani) 

Above gibt einen Vektor aller NA. Ich habe auch versucht:

as.numeric.factor <- function(x) {seq_along(levels(x))[x]} 
ir.pres2014$Rouhani2<-as.numeric.factor(ir.pres2014$Rouhani) 

Und:

ir.pres2014$Rouhani2<-as.numeric(levels(ir.pres2014$Rouhani))[ir.pres2014$Rouhani] 

Und:

ir.pres2014$Rouhani2<-as.numeric(paste(ir.pres2014$Rouhani)) 

Alle, Rückkehr der NA. Ich habe auch versucht die folgenden:

ir.pres2014$Rouhani2<-as.numeric(as.factor(ir.pres2014$Rouhani)) 

, die eine Liste von einstelligen Zahlen erstellt und so war es eindeutig nicht die Zeichenfolge in der Art und Weise Umwandlung ich im Sinn haben. Jede Hilfe wird sehr geschätzt.

Antwort

3

Der Grund dafür ist was wie vor den Zahlen einen führenden Platz aussieht:

> ir.pres2014$Rouhani 
[1] " 1052345" " 885693" " 384751" " 1017516" " 519412" " 175608" … 

Entfernen Sie einfach, dass auch vor der Umstellung. Die Situation durch die Tatsache erschwert, dass dieser Charakter nicht wirklich ein Raum ist, dann ist es etwas anderes:

mystery_char = substr(ir.pres2014$Rouhani[1], 1, 1) 
charToRaw(mystery_char) 
# [1] c2 a0 

Ich habe keine Ahnung, woher es kommt, aber es muss ersetzt werden:

str_replace_all(x, rawToChar(as.raw(c(0xc2, 0xa0))), '') 

Darüber hinaus können Sie Ihren Code, indem die gleiche Transformation auf alle Ihre Spalten auf einmal vereinfachen:

mystery_char = rawToChar(as.raw(c(0xc2, 0xa0))) 
to_replace = sprintf('[,%s]', mystery_char) 
clean_numbers = function (x) as.numeric(str_replace_all(x, to_replace, '')) 
ir.pres2014 = ir.pres2014 %>% mutate_each(funs(clean_numbers), -province) 
+0

ich versuchte ich vergessen zu erwähnen, dass auch mit '' ir.pres2014 $ Rouhani <-gsub (“‚‘ ", ir.pres2014 $ Rouhani)" aber s bis die gleiche –

+1

@CyrusMohammadian Nun, das ist genau das gleiche wie das, was Sie gerade tun. –

+0

Danke für die Tipps zur Verwendung einer Funktion, um das Durcheinander zu reduzieren, aber ich werde immer noch NA gezwungen. –