2017-06-06 18 views
1

私は、私たちがテーブルに入れて分析したいいくつかの巨大なテキストファイル(それぞれが1ギガバイトに近い)を持つプロジェクトに持ち込まれました。各テキストファイルは1年間のデータで構成され、各データポイントは3つのカテゴリのいずれかに属しています。最終的な結果は各カテゴリの1つのリストで、各年の観測値を列として含みます。複数のファイルを複数のリストに読み込む

今のところ、各ファイルをリストに読み込んだ後、カテゴリに応じてリストを分割し、年ごとに3つの新しいリストを作成してから、rbind年の異なるカテゴリのすべてのリスト最終的なリスト。以下のような大量のデータでおり、それを周りに移動させながら、これはそれを2回、それはすべてのデータファイルを形成読み込むように私には思える、コピー

Year1 <- read.table(YearOneFilePath) 
table(Year1$category) 
Year1A <- Year1[Year1$category == "A",] 
Year1B <- Year1[Year1$category == "B",] 
Year1C <- Year1[Year1$category == "C",] 
rm(Year1) 
Year2 <- read.table(YeartwoFilePath) 
table(Year2$category) 
Year2A <- Year2[Year2$category == "A",] 
Year2B <- Year2[Year2$category == "B",] 
Year2C <- Year2[Year2$category == "C",] 
rm(Year2) 
Year3 <- read.table(YearThreeFilePath) 
table(Year3$category) 
Year3A <- Year3[Year3$category == "A",] 
Year3B <- Year3[Year3$category == "B",] 
Year3C <- Year3[Year3$category == "C",] 
rm(Year3) 


A <- rbind(Year1A, Year2A, Year3A) 
B <- rbind(Year1B, Year2B, Year3B) 
C <- rbind(Year1C, Year2C, Year3C) 

rm(Year1A) 
rm(Year2A) 
rm(Year3A) 
rm(Year1B) 
rm(Year2B) 
rm(Year3B) 
rm(Year1C) 
rm(Year2C) 
rm(Year3C) 

:私は(匿名)発表されたRファイルについては、以下を参照してください。これには長い時間と多くのメモリが必要です。明らかに私はのリストをYearX[YearX$Category == "Y",]のファンクションに直接入れることができますが、それでも実行中のある時点では2つの完全なコピーがすべてあることを意味します。最終的なファイルを各ファイルの1つのリードスルー上のファイルからリストアップし、すべてのデータをさらにコピーすることなく、最後のファイルをABおよびCのリストにする方法はありますか?分割のため

+0

を見るには、実際のRはとても大きくオブジェクトはありますか?ドライブ上の1ファイルにつき1Gbですが、特に各フィールドに固有の値がほとんどない場合は、Rにロードされたものはずっと少なくなります。 Rstudioの環境パネルでサイズを確認するか、 'object.size'関数を使用してください。 –

+0

最新の手順で' rbindlist'を使用することを検討してください:[link](https://stackoverflow.com/questions/15673550/理由があります - rbindlist-better-than-rbind) –

+0

と多分[this](https://stackoverflow.com/questions/9573055/r-selecting-subset-without-copying)あなたがコピーを作成しない限り長いです。 –

答えて

0
library(data.table) 

Year1 <- fread(YearOneFilePath) 
Year1[, .N ,by = category] 
Year1A <- Year1[Year1$category == "A",,] 
Year1B <- Year1[Year1$category == "B",,] 
Year1C <- Year1[Year1$category == "C",,] 
rm(Year1) 
gc() 
#YES garbage collection may help ;) 
A <- rbind(Year1A, Year2A, Year3A) 
rm(Year1A) 
rm(Year2A) 
rm(Year3A) 
gc() 

ここにもう一つの方法である、

split_list1=split(Year1 ,Year1$category) 
Year1A <-split_list1[[1]] 
Year1B <-split_list1[[2]] 
Year1C <-split_list1[[3]] 

split data table to small tables R

関連する問題