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?
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 sifill
oublank.lines.skip are true
, alors spécifiezcol.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
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.
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