web-dev-qa-db-fra.com

Remplacer les types de colonnes lors de l'importation de données à l'aide de readr :: read_csv () lorsqu'il y a plusieurs colonnes

J'essaie de lire un fichier csv en utilisant readr :: read_csv dans R. Le fichier csv que j'importe a environ 150 colonnes, j'inclus juste les premières colonnes de l'exemple. Je cherche à remplacer la deuxième colonne du type par défaut (qui est la date lorsque je fais read_csv) au caractère ou à un autre format de date.

GIS Join Match Code Data File Year  State Name  State Code  County Name County   Code   Area Name   Persons: Total
G0100010    2008-2012   Alabama 1   Autauga County  1   Autauga County, Alabama 54590

df <- data.frame("GIS Join Match Code"="G0100010", "Data File" = "2008-2012", "State" = "Alabama", "County" = "Autauga County", "Population" = 54590)

Le problème est que lorsque j'utilise readr :: read_csv, il semble que je devrais utiliser toutes les variables tout en remplaçant les col_types (voir l'erreur ci-dessous). Il est nécessaire de spécifier la substitution de toutes les 150 colonnes individuellement (?). La question est la suivante: existe-t-il un moyen de spécifier la substitution du col_type de colonnes spécifiques ou d'une liste nommée d'objets? Dans mon cas, ce serait simplement remplacer la colonne "Année du fichier de données".

Je comprends que toutes les colonnes omises seront automatiquement analysées, ce qui est bien pour mon analyse. Je pense que cela devient plus complexe car les noms de colonne ont un espace dans le fichier que j'ai téléchargé (par exemple, "Année du fichier de données", "Code d'état"), etc.

tempdata <- read_csv(df, col_types = "cc")
Error: You have 135 column names, but 2 columns

L'autre option, je suppose, si possible, est de sauter la lecture de la deuxième colonne tous ensemble?

27
rajvijay

Voici une réponse plus générique à cette question si quelqu'un tombe sur cela à l'avenir. Il est moins conseillé d'utiliser "sauter" pour sauter des colonnes car cela ne fonctionnera pas si la structure de la source de données importée est modifiée.

Il pourrait être plus facile dans votre exemple de simplement définir un type de colonne par défaut, puis de définir toutes les colonnes qui diffèrent de la valeur par défaut.

Par exemple, si toutes les colonnes sont généralement "d", mais que la colonne de date doit être "D", chargez les données comme suit:

  read_csv(df, col_types = cols(.default = "d", date = "D"))

ou si, par exemple, la date de la colonne doit être "D" et la colonne "xxx" être "i", procédez comme suit:

  read_csv(df, col_types = cols(.default = "d", date = "D", xxx = "i"))

L'utilisation de "par défaut" ci-dessus est puissante si vous avez plusieurs colonnes et seulement des exceptions spécifiques (telles que "date" et "xxx").

36
Nick

Oui. Par exemple, pour forcer les données numériques à être traitées comme des caractères:

examplecsv = "a,b,c\n1,2,a\n3,4,d"
read_csv(examplecsv)
# A tibble: 2 x 3
#      a     b     c
#  <int> <int> <chr>
#1     1     2     a
#2     3     4     d
read_csv(examplecsv, col_types = cols(b = col_character()))
# A tibble: 2 x 3
#      a     b     c
#  <int> <chr> <chr>
#1     1     2     a
#2     3     4     d

Les choix sont:

col_character() 
col_date()
col_time() 
col_datetime() 
col_double() 
col_factor() # to enforce, will never be guessed
col_integer() 
col_logical() 
col_number() 
col_skip() # to force skip column

Plus: http://readr.tidyverse.org/articles/readr.html

9
Lukasz