2017-10-18 5 views
0

J'ai un csv que je voudrais importer dans R comme un data.frame. Cette csv a des en-têtes tels que USD.ZeroCouponBondPrice(1m) et USD-EQ-SP500 que je ne peux pas changer. Lorsque je tente de l'importer dans R, cependant, la fonction de R read.csv remplace les caractères ()- comme . Bien que je ne pouvais pas trouver un moyen de résoudre ce problème dans la fonction documentation, cette ligne de code a fonctionné:R read.csv Importer des noms de colonne de façon incorrecte

colnames(df)<-c('USD.ZeroCouponBondPrice(1m)', 'USD-EQ-SP500') 

donc ces caractères sont légaux dans data.frame noms de colonne. Remplacer tous les noms de colonne est ennuyeux et fragile car il y en a plus de 20 et il n'est pas impensable qu'ils changent. Y a-t-il un moyen d'empêcher read.csv de remplacer ces caractères, ou une autre fonction à utiliser?

+0

Je ne sais pas comment, mais possible, vous pourriez faire une entaille en utilisant 'Tibbles'. Avec 'Tibbles', vous pouvez [utiliser _crazy name_] (https://cran.r-project.org/web/packages/tibble/vignettes/tibble.html) pour les noms des variables. –

Répondre

3

Si vous définissez l'argument

check.names = FALSE 

dans read.csv, alors R ne remplace pas les noms. Mais ces noms ne sont pas valides dans R et ils devront être traités différemment des noms valides.

+0

Un exemple de "géré différemment" est que si vous utilisez la notation "$" pour référencer une variable, vous aurez besoin d'un retour en arrière autour du nom de la variable, par ex. 'df $ \' USD.ZeroCouponBondPrice (1m) \ ''. –

-2

Illustrant une solution Tibbles possible en utilisant Kelli-Jean's answer sur la façon d'utiliser check.names = FALSE

# install.packages(c("tidyverse"), dependencies = TRUE) 
library(tibble) 
dta <- url("http://s3.amazonaws.com/csvpastebin/uploads/a4c665743904ea8f18dd1f31edcbae04/crazy_names.csv") 
TBdta <- as_tibble(read.csv(dta, check.names = FALSE)) 
TBdta 
#> # A tibble: 6 x 3 
#> USD.ZeroCouponBondPrice(1m) USD-EQ-SP500 crazy name 
#>      <fctr>  <dbl>  <int> 
#> 1       A   10.0   12 
#> 2       A   11.0   14 
#> 3       B   5.0   8 
#> 4       B   6.0   10 
#> 5       A   10.5   13 
#> 6       B   7.0   11 

Assurez-vous de lire this introduction to Tibbles comme ils ne se comportent un peu différent de trames de données régulières.

au cas où quelqu'un besoin d'utiliser https

temporaryFile <- tempfile() 
download.file("https://s3.amazonaws.com/csvpastebin/uploads/a4c665743904ea8f18dd1f31edcbae04/crazy_names.csv", destfile = temporaryFile, method="curl") 
TBdta2 <- as_tibble(read.csv(temporaryFile, check.names = F)) 
+0

Vous pouvez utiliser des noms non valides pour des variables dans un bloc de données natif, comme le montre le résultat de 'read.csv (dta, check.names = FALSE)'. La seule différence que je vois avec les tibbles est qu'il ne convertit pas automatiquement les noms lorsque vous utilisez la fonction 'tibble()' pour en créer un. Je ne vois aucun avantage supplémentaire à enrouler 'as_tibble()' autour de 'read.csv()', du moins en ce qui concerne la question de l'OP. –

+0

@BrianStamper J'apprécie vos commentaires. –

+1

J'ai accepté la réponse de @ Kelli-Jean parce que c'était plus facile à implémenter comme solution, mais j'ai trouvé cette réponse utile comme alternative légitime. Je n'ai pas spécifié que je voulais une réponse qui utilise uniquement les paquets de base de R, donc je ne pense pas que cette réponse mérite le vote négatif (je ne sais pas si c'était vous). – Theaetetos