2017-10-03 10 views
-1

私は自動的に開きたいデータをいくつか持っていますが、いくつかの値をとり、すべてを1つのデータフレームにまとめます。Improove/for-Loop in Rを回避

最初にファイル名を検索し、1つずつ(forループ内で)開き、それらを一緒に設定します。コードは正常に動作します。しかし、多くのファイルがあるので、時間がかかります。現時点で私はこれを行うための他の方法は考えられません...私の質問は、プロセスを固定するオプションはありますか?ループを使用しない場合がありますか?特に第2のループを避ければ、性能が向上する。

私はコードの最小限の例を作ろうとしました。 (例えばdata_sなど)一部の行は、この例では多くの意味を作るいけないが、実際には、彼らは、「データ」の構造ザッツ;-)

all.files  <- list.files(recursive = T) 
df   <- data.frame(matrix(, nrow=1000, ncol=242)) 

for (i in 1:length(all.files) { 
    Data  <- read.table(all.files[i]), header=F)  
    name  <- Data[i,2] 
    data_s <- i+6 

    for (k in 1:240){ 
      df[data_s+k,k+2]  <- Data[24+k,3] 
    } 

assign(name,df) 
rm(name,df) 
} 

行います

enter image description here

のthatsをどのように私の最終的なファイル(「DF」)は次のようになります。あなたの助けを

enter image description here

おかげでたくさん!

+2

おそらく、すべてのファイルをdata.frames、mydfList、 - lapply(...、read.csv)のリストに読み込み、 'lapply'を使って2回目のパスで何らかのクリーニングを行うか、最初。最後に、 'do.call(rbind、mydfList)'などを使用してリストを単一のdata.frameに結合します。たとえば、ファイルをdata.framesのリストに読み込む場合は、[this post](https://stackoverflow.com/questions/5758084/loop-in-r-loading-files)を参照してください。 – lmo

+0

たぶん私は何か不足しているかもしれませんが、 'i'をシフトすると、2番目のループの' df'のデータを上書きしているようです。 – juan

+0

ありがとうございました!私はいつもgappchtの答えと組み合わせてlapply()を実際に助けたことを忘れる! – nvw

答えて

2

私はdata.table-packageとそのfread関数を使用します。 read.tableよりはるかに高速で、構文は一般的にdata.frame構文よりも優れています。

library(dplyr) # for the left_join 
library(data.table) # data.table for fread and nicer syntax 
final <- data.table(dateandtime = as.character()) 
for (file in list.files(recursive = T)) { 
    new <- fread(file, stringsAsFactors = F) 
    final <- data.table(full_join(final, new, by = "dateandtime")) 
} 

EDIT1:あなたの問題は、このようなもので解決されなければならない場合を考慮して、「FULL_JOIN」に「left_joinを」変更されたファイル間のobservation-「dateandtimesは」異なるました。

EDIT2:「最終」-data.tableを列「dateandtime」でインスタンス化して、最初の要素に対する結合作業を行います。

+0

申し訳ありません私は少し速かったです。私の問題は、私がunz(zip.file1、all.files1inzipfile1)のようなもので開いたzipファイルがあることです。この1つは実際にあなたのオプションで働いていませんでした。ラウンドを試した後、私はすべてのファイルを最初に解凍することに決めました...あなたの助けをありがとう! – nvw

+0

ああ、大丈夫です。素晴らしいです。 :) – guscht

0

まず、説明したようにデータを作成しました。パッケージreshape2のIは、関数が(溶融使用されるよりも

df <- diag(nrow = 10,ncol = 10) 
df[df == 0] <- NA 
df <- as.data.frame(df) 
df 

df$X <- 7 


library(reshape2) 

melt(df,id.vars = "X",na.rm = TRUE) 

私はこのことができます願っています。