Comment Pouvez-vous 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 varie en longueur, dans un format csv. Voici un exemple de fichier texte.

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 parce que la taille est déterminée à partir des 5 premières lignes. Y a-t-il une façon de forcer r à mettre les données dans plus de colonnes?

34
demandé sur Blue Magister 2013-09-20 21:24:26

3 réponses

de Profondeur dans le ?read.table de la documentation il est le suivant:

le nombre de colonnes de données est déterminé en regardant les cinq premiers lignes d'entrée (ou le fichier entier s'il a moins de cinq lignes), ou de la longueur de col.names s'il est spécifié et est plus long. Ce fill ou blank.lines.skip are true , donc préciser col.names si nécessaire (comme dans les exemples).

par conséquent, définissons col.names comme étant la longueur X (où X est le nombre maximum de champs dans votre ensemble de données), et définissons 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 maximum de champs est inconnu, vous pouvez utiliser la fonction d'utilité nifty 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

peut-être utile lecture connexe: seulement lire le nombre limité de colonnes dans R

50
répondu Blue Magister 2017-05-23 11:46:58

vous pourriez 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.

6
répondu Roland 2013-09-20 17:39:09

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
répondu Arun 2013-09-20 17:52:25