Domanda

Sto cercando di leggere nel file R A CSV che contiene informazioni sui contributi politici. Da quello che ho capito, le colonne per impostazione predefinita sono importate come fattori, ma ho bisogno che la colonna di importo ('ctrib_amt' nel set di dati) sia importata come colonna numerica in modo da poter eseguire una varietà di funzioni per cui non funzionerebbe fattori. La colonna è formattata come valuta con un prefisso "$".

Inizialmente ho usato un semplice comando di lettura per importare il file:

contribs <- read.csv('path/to/file')

E quindi ho provato a convertire CTRIB_AMT da valuta a numerico:

as.numeric(as.character(sub("$","",contribs$CTRIB_AMT, fixed=TRUE)))

Ma non ha funzionato. Le funzioni che sto cercando di usare per le colonne CTRIB_AMT sono:

vals<-sort(unique(dfr$CTRIB_AMT))
sums<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, sum)
counts<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, length)

Vedi domanda correlata qui.

Qualche idea su come importare il file inizialmente, quindi la colonna è numerica o come convertirlo dopo l'importazione?

È stato utile?

Soluzione

Non sono sicuro di come leggerlo direttamente, ma puoi modificarlo una volta che è in:

> A <- read.csv("~/Desktop/data.csv")
> A
  id   desc price
1  0  apple $1.00
2  1 banana $2.25
3  2 grapes $1.97
> A$price <- as.numeric(sub("\\$","", A$price))
> A
  id   desc price
1  0  apple  1.00
2  1 banana  2.25
3  2 grapes  1.97
> str(A)
'data.frame':   3 obs. of  3 variables:
 $ id   : int  0 1 2
 $ desc : Factor w/ 3 levels "apple","banana",..: 1 2 3
 $ price: num  1 2.25 1.97

Penso che potrebbe essere stata solo una fuga mancante nel tuo sottomarino. $ indica la fine di una linea nelle espressioni regolari. $ è un segno di dollaro. Ma poi devi sfuggire alla fuga ...

Altri suggerimenti

Un altro modo potrebbe essere l'impostazione della conversione utilizzando setAs.
È stato usato in due (simili) domanda:

Per le tue esigenze:

setClass("Currency")
setAs("character", "Currency",
    function(from) as.numeric(sub("$","",from, fixed=TRUE)))

contribs <- read.csv("path/to/file", colClasses=c(CTRIB_AMT="Currency"))

Ancora un'altra soluzione per un problema risolto molto tempo fa:

convertCurrency <- function(currency) {
  currency1 <- sub('$','',as.character(currency),fixed=TRUE)
  currency2 <- as.numeric(gsub('\\,','',as.character(currency1))) 
  currency2
}

contribs$CTRIB_AMT_NUM <- convertCurrency(contribs$CTRIB_AMT)

Approfittando dei potenti parser il readr Il pacchetto offre Out Out of the Box:

my_parser <- function(col) {
  # Try first with parse_number that handles currencies automatically quite well
  res <- suppressWarnings(readr::parse_number(col))
  if (is.null(attr(res, "problems", exact = TRUE))) {
    res
  } else {
    # If parse_number fails, fall back on parse_guess
    readr::parse_guess(col)
    # Alternatively, we could simply return col without further parsing attempt
  }
}

library(dplyr)

name <- c('john','carl', 'hank')
salary <- c('$23,456.33','$45,677.43','$76,234.88')
emp_data <- data.frame(name,salary)

emp_data %>% 
  mutate(foo = "USD13.4",
         bar = "£37") %>% 
  mutate_all(my_parser)

#   name   salary  foo bar
# 1 john 23456.33 13.4  37
# 2 carl 45677.43 13.4  37
# 3 hank 76234.88 13.4  37

O usa qualcosa di simile as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) Sappiamo che certamente non ci saranno più di 20 personaggi.

Un'altra cosa da notare è che è possibile rimuovere la necessità di convertirsi da un fattore se si imposta stringsAsFactors=F Nella tua chiamata a read.csv()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top