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?
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. Cefill
oublank.lines.skip are true
, donc précisercol.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
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.
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