web-dev-qa-db-ja.com

異なる列数でRのCSVファイルをどのように読み取ることができますか

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)

サイズは最初の5行から決定されるため、Rはデータセットを3列であると解釈します。とにかくrにより多くの列にデータを配置するように強制する方法はありますか?

41
CompChemist

?read.tableドキュメントの詳細は次のとおりです。

データ列の数は、入力の最初の5行(または5行未満の場合はファイル全体)を調べるか、指定されてより長い場合は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ユーティリティ関数count.fieldsread.tableサンプルコードで見つけました)を使用できます。

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

関連する読書に役立つ可能性がある: Rの限られた数の列のみを読む

59
Blue Magister

次のようなデータを読み取ることができます。

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

これはリストになります。

7
Roland

これは動作するようです(@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
Arun