Tekenreeks converteren naar numeriek

Ik heb een testbestand geïmporteerd en geprobeerd een histogram te maken

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")   
hist <- as.numeric(pichman$WS)    

Ik krijg echter andere getallen van waarden in mijn dataset. Oorspronkelijk dacht ik dat dit omdat ik tekst had, dus heb ik de tekst verwijderd:

table(pichman$WS)    
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]    

Ik krijg echter nog steeds zeer hoge cijfers, heeft iemand een idee?


Antwoord 1, autoriteit 100%

Ik vermoed dat je een probleem hebt met factoren. Bijvoorbeeld

> x = factor(4:8)
> x
[1] 4 5 6 7 8
Levels: 4 5 6 7 8
> as.numeric(x)
[1] 1 2 3 4 5
> as.numeric(as.character(x))
[1] 4 5 6 7 8

Enkele opmerkingen:

  • U vermeldt dat uw vector de tekens “Down” en “NoData” bevat. Wat verwacht/wil as.numericmet deze waarden doen?
  • Probeer in read.csvhet argument stringsAsFactors=FALSE
  • te gebruiken

  • Weet je zeker dat het sep="/tis en niet sep="\t"
  • Gebruik het commando head(pitchman)om de eerste paar rijen van je gegevens te controleren
  • Het is ook erg lastig om te raden wat uw probleem is als u geen gegevens verstrekt. Een minimaal werkend voorbeeld heeft altijd de voorkeur. Ik kan bijvoorbeeld het commando pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")niet uitvoeren omdat ik dat niet heb toegang tot de dataset.

Antwoord 2, autoriteit 10%

Zoals CSGILLESPIE zei. Stringsasfactors is standaard op true, die elke tekst naar een factor converteert. Dus zelfs na het verwijderen van de tekst, heb je nog steeds een factor in je dataframe.

Nu met betrekking tot de conversie, is er een optimale manier om dit te doen. Dus ik leg het hier als referentie:

> x <- factor(sample(4:8,10,replace=T))
> x
 [1] 6 4 8 6 7 6 8 5 8 4
Levels: 4 5 6 7 8
> as.numeric(levels(x))[x]
 [1] 6 4 8 6 7 6 8 5 8 4

om het te laten zien werken.

De timings:

> x <- factor(sample(4:8,500000,replace=T))
> system.time(as.numeric(as.character(x)))
   user  system elapsed 
   0.11    0.00    0.11 
> system.time(as.numeric(levels(x))[x])
   user  system elapsed 
      0       0       0 

Het is een grote verbetering, maar niet altijd een knelpunt. Het wordt echter belangrijk, maar als je een groot dataframe hebt en veel kolommen om te converteren.

Other episodes