Подтвердить что ты не робот

Как вы можете прочитать CSV файл в R с различным количеством столбцов

У меня есть разреженный набор данных, номер столбца которого зависит от длины, в формате csv. Вот пример текста файла.

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.csv("data.txt", header = F)

R интерпретирует набор данных как имеющий 3 столбца, потому что размер определяется из первых 5 строк. Есть ли способ заставить r разместить данные в большем количестве столбцов?

4b9b3361

Ответ 1

В документации ?read.table в глубину документа имеется следующее:

Количество столбцов данных определяется путем просмотра первых пяти строки ввода (или весь файл, если он имеет менее пяти строк), или от длины col.names, если она указана и длиннее. Эта может быть ошибочным, если fill или blank.lines.skip are true, поэтому при необходимости укажите col.names (как в "примерах" ).

Поэтому определим col.names как длину X (где X - максимальное количество полей в вашем наборе данных) и установите 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

Если максимальное количество полей неизвестно, вы можете использовать функцию nifty utility count.fields (которую я нашел в примере кода read.table):

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

Возможно полезное связанное чтение: Только чтение ограниченного количества столбцов в R

Ответ 2

Вы можете прочитать такие данные:

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

В результате появляется список.

Ответ 3

Это похоже на работу (после предложения @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