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?
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ślifill
lubblank.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
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ę.
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
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