Question

Je suis en train de lire dans R un fichier .csv qui contient des informations sur les contributions politiques. D'après ce que je comprends, les colonnes par défaut sont importées sous forme de facteurs, mais je dois la colonne de quantité ( « CTRIB_AMT » dans l'ensemble de données) à importer en tant que colonne numérique afin que je puisse exécuter une variété de fonctions qui ne fonctionnerait pas pour facteurs. La colonne est formaté comme une monnaie avec un « $ » comme préfixe.

J'utilisé une simple commande de lecture pour importer le fichier initialement:

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

Et puis essayé de convertir le CTRIB_AMT de monnaie numérique:

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

Mais cela ne fonctionne pas. Les fonctions que je suis en train d'utiliser pour les colonnes CTRIB_AMT sont:

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

Voir la question connexe .

Toute réflexion sur la façon dont importer le fichier initialement si la colonne est numérique ou comment convertir après l'importation?

Était-ce utile?

La solution

Je ne sais pas comment le lire directement, mais vous pouvez le modifier une fois dans:

> 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

Je pense qu'il pourrait avoir juste été une évasion qui manque dans votre sous. $ Indique la fin d'une ligne dans les expressions régulières. \ $ Est un signe de dollar. Mais alors vous devez échapper à l'évasion ...

Autres conseils

Une autre façon pourrait être la conversion réglage à l'aide setAs.
Il a été utilisé dans deux (similaire) question:

Pour vos besoins:

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

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

Une autre solution pour un problème résolu depuis longtemps:

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)

Profitant des puissants parseurs le paquet readr offres de la boîte:

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

Ou utiliser quelque chose comme as.numeric(substr(as.character(contribs$CTRIB_AMT),2,20)) nous savons qu'il n'y aura certainement pas plus de 20 caractères.

Une autre chose à noter est que vous pouvez supprimer le besoin de convertir d'un facteur alltogether si vous définissez stringsAsFactors=F dans votre appel à read.csv()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top