2013-02-14 4 views
11

Dopo aver importato una tabella da Wikipedia, ho una lista di valori della forma seguente:Posso usare gsub() su ogni elemento di un frame di dati?

> tbl[2:6] 
    $`Internet 
    Explorer` 
    [1] "30.71%" "30.78%" "31.23%" "32.08%" "32.70%" "32.85%" "32.04%" "32.31%" "32.12%" "34.07%" "34.81%" 
    [12] "35.75%" "37.45%" "38.65%" "40.63%" "40.18%" "41.66%" "41.89%" "42.45%" "43.58%" "43.87%" "44.52%" 

    $Chrome 
    [1] "36.52%" "36.42%" "35.72%" "34.77%" "34.21%" "33.59%" "33.81%" "32.76%" "32.43%" "31.23%" "30.87%" 
    [12] "29.84%" "28.40%" "27.27%" "25.69%" "25.00%" "23.61%" "23.16%" "22.14%" "20.65%" "19.36%" "18.29%" 

sto cercando di sbarazzarsi dei segni di percentuale, al fine di convertire i dati in forma numerica.

C'è un modo più rapido per pulire questi dati rispetto a una vettorizzazione? Il mio codice corrente segue:

data <- lapply(tbl[2:6], FUN = function(x) as.numeric(gsub("%", "", x))) 

I dati alla fine diventano un frame di dati, ma non ho potuto ottenere gsub per funzionare correttamente su tutti gli elementi di un frame di dati. C'è un modo per gsub() ogni elemento di un frame di dati?

The code for the project is online, with results. Grazie in anticipo!

+1

Questo è più probabilmente solo un elenco di un dataframe. E ... lapply funzionerà anche con i dataframes poiché sono in realtà elenchi con attributi speciali. –

+0

È una lista. Ma 'gsub' non funziona come ho bisogno su di esso (' lapply' funziona bene). –

+1

Poiché data.frames sono elenchi speciali e si dispone di un metodo testato per gli elenchi, questo avrebbe quasi sicuramente funzionato: 'dfrm <- as.data.frame (lapply (tbl [2: 6], FUN = function (x) as .numeric (gsub ("%", "", x)))) ' –

risposta

11

Beh penso che si possa fare nel modo seguente, ma non so se è meglio o più pulita della tua:

df <- data.frame(tbl) 
df[,-1] <- as.numeric(gsub("%", "", as.matrix(df[,-1]))) 

che dà:

R> head(df) 
      Date Internet.Explorer Chrome Firefox Safari Opera Mobile 
1 January 2013    30.71 36.52 21.42 8.29 1.19 14.13 
2 December 2012    30.78 36.42 21.89 7.92 1.26 14.55 
3 November 2012    31.23 35.72 22.37 7.83 1.39 13.08 
4 October 2012    32.08 34.77 22.32 7.81 1.63 12.30 
5 September 2012    32.70 34.21 22.40 7.70 1.61 12.03 
6 August 2012    32.85 33.59 22.85 7.39 1.63 11.78 
R> sapply(df, class) 
      Date Internet.Explorer   Chrome   Firefox 
     "factor"   "numeric"   "numeric"   "numeric" 
      Safari    Opera   Mobile 
     "numeric"   "numeric"   "numeric" 
+0

Questo funziona meglio per me, è sia più breve e più facile da leggere. Ho aggiornato il codice per riconoscere –

+0

Ah, grazie per i crediti, ti mando in cambio del mio pacchetto in cambio :) – juba

+0

[off-topic] Grazie! Sto pianificando più funzioni come quella che ho presentato. sono direttamente ispirati dai comandi Stata che ritengo più utili per analizzare i sondaggi. [on-topic] Capita spesso di avere un frame di dati in cui tutte le colonne tranne una sono formattate nello stesso modo. Sto anche pensando di programmare una piccola routine funzionerebbe un po 'come' melt' (con un argomento 'id.vars') per questi tipi di operazioni. –

4

Come Juba I Sono incerto se in questo modo è "migliore o più pulito", ma ... per agire su tutti gli elementi di un frame dati, è possibile utilizzare applicare:

# start with data frame, not list 
url <- "http://en.wikipedia.org/wiki/Usage_share_of_web_browsers" 
# Get the eleventh table. 
tbl <- readHTMLTable(url, which = 11, stringsAsFactors = F) 

# use apply on the non-date columns 
tbl[, 2:7] <- apply(tbl[, 2:7], 2, function(x) as.numeric(gsub("%", "", x))) 
Problemi correlati