Jak można odczytać plik CSV w R z różną liczbą kolumn

Mam nieliczny zestaw danych, taki, którego liczba kolumn różni się długością, w formacie csv. Oto przykładowy tekst pliku.

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

Kiedy używam

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

R zinterpretuje zbiór danych jako posiadający 3 kolumny, ponieważ rozmiar jest określony z pierwszych 5 wierszy. Czy jest i tak zmuszanie r do umieszczania danych w kolejnych kolumnach?

Author: Blue Magister, 2013-09-20

3 answers

W dokumentacji ?read.table znajduje się:

Liczbę kolumn danych określa się patrząc na pierwsze pięć linie wejściowe (lub cały plik, jeśli ma mniej niż pięć linii), lub od długości col.names, jeśli jest określona i jest dłuższa. To może się mylić, jeśli fill lub blank.lines.skip are true, więc w razie potrzeby należy podać col.names (jak w "przykładach").

Dlatego zdefiniujmy col.names jako długość x (gdzie X jest maksymalną liczbą fields in your dataset), and set 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

Jeśli Maksymalna liczba pól jest nieznana, możesz użyć funkcji nifty utility count.fields (którą znalazłem w przykładowym kodzie read.table):

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

Prawdopodobnie pomocne związane czytanie: tylko czytać ograniczoną liczbę kolumn w R

 50
Author: Blue Magister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:58

Możesz odczytać dane Tak:

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, ",")

To daje listę.

 6
Author: Roland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 17:39:09

To chyba działa (zgodnie z sugestią @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
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 17:52:25