web-dev-qa-db-fra.com

Comment lire un fichier CSV en R avec un nombre différent de colonnes

J'ai un ensemble de données clairsemé, un dont le nombre de colonnes varient en longueur, dans un format csv. Voici un exemple du texte du fichier.

12223, University
12227, bridge, Sky
12828, Sunset
13801, Ground
14853, Tranceamerica
14854, San Francisco
15595, shibuya, Shrine
16126, fog, San Francisco
16520, California, ocean, summer, golden gate, beach, San Francisco

Quand j'utilise

read.csv("data.txt", header = F)

R interprétera l'ensemble de données comme ayant 3 colonnes car la taille est déterminée à partir des 5 premières lignes. Est-il possible de forcer r à mettre les données dans plus de colonnes?

41
CompChemist

Au fond du ?read.table la documentation est la suivante:

Le nombre de colonnes de données est déterminé en examinant les cinq premières lignes d'entrée (ou le fichier entier s'il contient moins de cinq lignes), ou à partir de la longueur de col.names s'il est spécifié et est plus long. Cela pourrait être incorrect si fill ou blank.lines.skip are true, alors spécifiez col.names si nécessaire (comme dans les "Exemples").

Par conséquent, définissons col.names pour être la longueur X (où X est le nombre maximum de champs dans votre jeu de données), et définissez fill = TRUE:

dat <- textConnection("12223, University
12227, bridge, Sky
12828, Sunset
13801, Ground
14853, Tranceamerica
14854, San Francisco
15595, shibuya, Shrine
16126, fog, San Francisco
16520, California, ocean, summer, golden gate, beach, San Francisco")

read.table(dat, header = FALSE, sep = ",", 
  col.names = paste0("V",seq_len(7)), fill = TRUE)

     V1             V2             V3      V4           V5     V6             V7
1 12223     University                                                          
2 12227         bridge            Sky                                           
3 12828         Sunset                                                          
4 13801         Ground                                                          
5 14853  Tranceamerica                                                          
6 14854  San Francisco                                                          
7 15595        shibuya         Shrine                                           
8 16126            fog  San Francisco                                           
9 16520     California          ocean  summer  golden gate  beach  San Francisco

Si le nombre maximal de champs est inconnu, vous pouvez utiliser la fonction utilitaire astucieuse count.fields (que j'ai trouvé dans le read.table exemple de code):

count.fields(dat, sep = ',')
# [1] 2 3 2 2 2 2 3 3 7
max(count.fields(dat, sep = ','))
# [1] 7

Lecture connexe éventuellement utile: Lire uniquement un nombre limité de colonnes dans R

59
Blue Magister

Vous pouvez lire les données comme ceci:

dat <- textConnection("12223, University
12227, bridge, Sky
12828, Sunset
13801, Ground
14853, Tranceamerica
14854, San Francisco
15595, shibuya, Shrine
16126, fog, San Francisco
16520, California, ocean, summer, golden gate, beach, San Francisco")

dat <- readLines(dat)
dat <- strsplit(dat, ",")

Il en résulte une liste.

7
Roland

Cela semble fonctionner (suivant la suggestion de @ BlueMagister):

tt <- read.table("~/Downloads/tmp.csv", fill=TRUE, header=FALSE, 
          sep=",", colClasses=c("numeric", rep("character", 6)))
names(tt) <- paste("V", 1:7, sep="")

     V1             V2             V3      V4           V5     V6             V7
1 12223     University                                                          
2 12227         bridge            Sky                                           
3 12828         Sunset                                                          
4 13801         Ground                                                          
5 14853  Tranceamerica                                                          
6 14854  San Francisco                                                          
7 15595        shibuya         Shrine                                           
8 16126            fog  San Francisco                                           
9 16520     California          ocean  summer  golden gate  beach  San Francisco
3
Arun