J'ai un simple fichier csv appelé "test.csv" avec le contenu suivant:
colA,colB,colC
1,"x",12
2,"y",34
3,"z",56
Disons que je veux sauter la lecture dans colA et simplement lire dans colB et colC. Je veux un moyen général de le faire car j'ai beaucoup de fichiers à lire et parfois colA s'appelle tout à fait autre chose mais colB et colC sont toujours les mêmes.
Selon la documentation read_csv, une façon d'y parvenir consiste à passer une liste nommée pour col_types et à ne nommer que les colonnes que vous souhaitez conserver:
read_csv('test.csv', col_types = list(colB = col_character(), colC = col_numeric()))
En ne mentionnant pas colA, il devrait être supprimé de la sortie. Cependant, la trame de données résultante est:
Source: local data frame [3 x 3]
colA colB colC
1 1 x 12
2 2 y 34
3 3 z 56
Suis-je en train de faire quelque chose de mal ou la documentation read_csv n'est-elle pas correcte? Selon le fichier d'aide:
S'il s'agit d'une liste, elle doit contenir un "collecteur" pour chaque colonne. Si vous souhaitez uniquement lire un sous-ensemble des colonnes, vous pouvez utiliser une liste nommée (où les noms donnent les noms des colonnes). Si une colonne n'est pas mentionnée par son nom, elle ne sera pas incluse dans la sortie.
Il y a une réponse là-bas, je n'ai pas cherché assez fort: https://github.com/hadley/readr/issues/132
Apparemment, c'était un problème de documentation qui a été corrigé. Cette fonctionnalité pourrait éventuellement être ajoutée, mais Hadley pensait qu'il était plus utile de pouvoir simplement mettre à jour un type de colonne et de ne pas supprimer les autres.
Mise à jour: la fonctionnalité a été ajoutée
Le code suivant provient de la documentation readr :
read_csv("iris.csv", col_types = cols_only( Species = col_factor(c("setosa", "versicolor", "virginica"))))
Cela lira uniquement la colonne Espèce de l'ensemble de données iris. Pour lire uniquement une colonne spécifique, vous devez également passer la spécification de colonne, c'est-à-dire col_factor
, col_double
, etc...
"Selon la documentation read_csv, une façon d'y parvenir est de passer une liste nommée pour col_types et de ne nommer que les colonnes que vous souhaitez conserver"
WRONG: read_csv('test.csv', col_types=list(colB='c', colC='c'))
Non, la doc est trompeuse, vous devez soit spécifier que les colonnes sans nom sont supprimées (class = '_'
/col_skip()
), soit spécifier explicitement leur classe comme NULL:
read_csv('test.csv', col_types=list('*'='_', colB='c', colC='c'))
read_csv('test.csv', col_types=list('colA'='_', colB='c', colC='c'))