Frage

Ich versuche, in eine CSV -Datei in eine CSV -Datei zu lesen, die Informationen zu politischen Beiträgen enthält. Soweit ich weiß, werden die Spalten standardmäßig als Faktoren importiert, aber ich muss die Spalte der Menge ('ctrib_amt' im Datensatz) als numerische Spalte importiert werden, damit ich eine Vielzahl von Funktionen ausführen kann, für die nicht funktionieren würde, für die nicht funktionieren würde, für die nicht funktionieren würde Faktoren. Die Spalte ist als Währung mit einem "$" als Präfix formatiert.

Ich habe einen einfachen Readbefehl verwendet, um die Datei zunächst zu importieren:

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

Und versuchte dann, die ctrib_am von Währung in numerisch umzuwandeln:

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

Aber das hat nicht funktioniert. Die Funktionen, die ich für die CTRIB_AMT -Spalten verwenden möchte, sind:

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

Siehe verwandte Frage hier.

Irgendwelche Gedanken darüber, wie die Datei zunächst importiert werden kann, ist die Spalte numerisch oder wie man sie nach dem Import umwandelt?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, wie ich es direkt lesen soll, aber Sie können es ändern, sobald es 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

Ich denke, es war vielleicht eine fehlende Flucht in Ihrem Sub. $ zeigt das Ende einer Linie in regulären Ausdrücken an. $ ist ein Dollarschild. Aber dann musst du der Flucht entkommen ...

Andere Tipps

Ein anderer Weg könnte die Konvertierung verwenden setAs.
Es wurde in zwei (ähnlicher) Frage verwendet:

Für Ihre Bedürfnisse:

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

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

Eine weitere Lösung für ein Problem vor langer Zeit gelöst:

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)

Nutzen Sie die mächtigen Parsers readr Paketangebote außerhalb der Schachtel:

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

Oder so etwas wie verwenden as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) Wir wissen, dass es sicherlich nicht mehr als 20 Charaktere geben wird.

Eine andere zu beachten ist, dass Sie die Notwendigkeit entfernen können, aus einem Faktor -Altarether zu konvertieren, wenn Sie festgelegt werden stringsAsFactors=F in Ihrem Anruf an read.csv()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top