2016-08-11 7 views
0

私はtidyr、reshape/reshape2というパッケージを使っていくつかの変更を加えたいというデータフレームがあります。大規模なデータフレームの再形成、溶け込み、鋳造R

setwd("C:\\...) 
files = list.files(pattern="*.dta") #making a list for the files. 
dflist <- list() 
    for (i in 1:length(files)){         
     dflist[[i]] <- read.dta13(files[i], nonint.factors = TRUE) 
     dflist[[i]] <- melt(dflist[[i]], id=c("C","Y","S","A")) 
     dflist[[i]] <- extract(dflist[[i]], variable, c('type', 'moment'), '^(.+)_([^_]+)$') 
     dflist[[i]] <- cast(dflist[[i]],...~type) 
    } 

さて、このコードは、大きなデータフレームのために働くがない:

Y  C  S  A B_B_m B_B_p C_m C_p D_m D_p 
2000 "AUSTRIA" "total" "no" 33  44 55 66 77 99 
2001 "AUSTRIA" "total" "no" 22  11 0 23 24 25 
2002 "AUSTRIA" "total" "no" 88  45 56 47 38 39 
2003 "AUSTRIA" "total" "no" 90  48 67 67 69 74 

は、私はこれを達成するために、次のコードを使用し

 "C" "Y" "S" "A"  "moment" "B_B" "C" "D" 
    "AUSTRIA" 2000 "total" "no"  "m"  33 55 77 
    "AUSTRIA" 2000 "total" "no"  "p"  44 66 99 
    "AUSTRIA" 2001 "total" "no"  "m"  22 0 24 
    "AUSTRIA" 2001 "total" "no"  "p"  11 23 25 
    "AUSTRIA" 2002 "total" "no"  "m"  88 56 38 
    "AUSTRIA" 2002 "total" "no"  "p"  45 47 39 
    "AUSTRIA" 2003 "total" "no"  "m"  90 67 69 
    "AUSTRIA" 2003 "total" "no"  "p"  48 67 74 

を来されなければなりません。私のデータフレームには数千もの変数がありますが、このコードを使用してメモリが不足しているか、Rがクラッシュしています。何か案は?

編集:

誰かがFFパッケージについて何かコメントが、そのコメントを削除しました。 ffdfbig <- read.csv.ffdf(file="dfbig.csv") しかし、これは私にエラーを与えたが:

`Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    scan() expected 'an integer', got '"1001"'` 
とにかく、私が試した...

を私は、このパッケージの中にビットを見てきたけど、私もRにデータフレームを読み取ることができるように見えることはできません

私もcolClasses引数使用してみました:

sampleData <- read.csv("dfbig.csv", header = TRUE, nrows = 5) 
    > classes <- sapply(sampleData, class) 
    > ffdfbig <- read.csv.ffdf(file="dfbig.csv",header = TRUE, colClasses=classes) 

をし、エラーの同じ種類だ:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    scan() expected 'an integer', got '"1"' 

:(

+0

どうすればいいですか? :( – Floris

答えて

1

データセットが大きい場合は、ffパッケージを試すことができます。 Hereを使用する方法の例があります。

別のオプションは、data.tableパッケージを使用することです。here基本的なチュートリアルがあります。

EDITED

[OK]を、ここで私がこれまで持っているものです。あなたはこれでFFパッケージを使用してファイルを読み込むことができ

Y,C,S,A,B_B_m,B_B_p,C_m,C_p,D_m,D_p 
2000,"AUSTRIA","total","no",33,44,55,66,77,99 
2001,"AUSTRIA","total","no",22,11,0,23,24,25 
2002,"AUSTRIA","total","no",88,45,56,47,38,39 
2003,"AUSTRIA","total","no",90,48,67,67,69,74 

:あなたはトラブル整数を読み込むを持っていたことを言っ

library(ff) 
library(ffbase) 
library(reshape2) 

ffdfbig <- read.csv.ffdf(file="/path/to/your/file/dataFile.csv", 
         colClasses=c("numeric", rep("factor", 3), rep("numeric", 6)), 
         header = T) 

あなたが提供されるサンプル・データを持つ.csvファイルを持っていると仮定すると、 (それらが.csvから推測されたとき)、ファイルを読み込み、明示的に列クラスを渡してffdfオブジェクトを生成することができました。

res <- ffdfdply(x=ffdfbig, split=ffdfbig$Y, FUN=function(x){ 
    df <- reshape(x, 
       v.names = "value", 
       varying = c("B_B_m", "B_B_p", "C_m", "C_p", "D_m", "D_p"), 
       timevar = "variable", 
       times = c("B_B_m", "B_B_p", "C_m", "C_p", "D_m", "D_p"), 
       direction = "long") 
    as.data.frame(df) 
}) 

私はffdfパッケージに関数を適用する方法について全く分からなかったが、this答えは私に鍵を与えた:あなたはffdfオブジェクトを持っていたら、これを使用して、再形成rocessの最初の部分を生成することができます。

上記のコードの結果は、このようになります:

res <- ffdfdply(x=res, split = res$Y, FUN = function(y){ 
    vars <- c("prefix", "moment") 
    df <- extract(y, variable, c('type', 'moment'), '^(.+)_([^_]+)$') 
}) 

res <- ffdfdply(x = res, split = res$Y, FUN = function(x){ 
    df <- dcast(x, ...~type) 
}) 

res$id <- NULL 
:「M」Sと「P」sおよびワイドフォーマットに鋳造

"Y","C","S","A","variable","value","id" 
2000,"AUSTRIA","total","no","B_B_m",33,1 
2001,"AUSTRIA","total","no","B_B_m",22,2 
2002,"AUSTRIA","total","no","B_B_m",88,3 
2003,"AUSTRIA","total","no","B_B_m",90,4 
2000,"AUSTRIA","total","no","B_B_p",44,1 
2001,"AUSTRIA","total","no","B_B_p",11,2 
2002,"AUSTRIA","total","no","B_B_p",45,3 
2003,"AUSTRIA","total","no","B_B_p",48,4 

最後に、「スプリット」プロセス

あなたは.csvに再びそれを書きたい場合は、あなたがこの機能を使用することができますが:

followiを生成する
write.csv.ffdf(res, "final.csv") 

csv

"","Y","C","S","A","moment","B_B","C.1","D" 
"1",2000,"AUSTRIA","total","no","m",33,55,77 
"2",2000,"AUSTRIA","total","no","p",44,66,99 
"3",2001,"AUSTRIA","total","no","m",22,0,24 
"4",2001,"AUSTRIA","total","no","p",11,23,25 
"5",2002,"AUSTRIA","total","no","m",88,56,38 
"6",2002,"AUSTRIA","total","no","p",45,47,39 
"7",2003,"AUSTRIA","total","no","m",90,67,69 
"8",2003,"AUSTRIA","total","no","p",48,67,74 

ngのあなたは、それがメモリ例外が発生するかどうかを確認するためにあなたの大きなcsvのすべてで、これらの機能を試すことができます。私はこれが役立つことを願っています

+3

あなたはここのポストへのリンクの情報の一部を持って来たいと思うかもしれません。他の情報なしの4リンクは非常に強い答えではありません。 –

関連する問題