2016-05-19 10 views
1

以下は私を少し夢中にしています。R:複数のxlsをdfとしてインポートし、1つのdfの列名を変更してからすべてのdfをマージするループ

私は現在、ファイルを毎月の財務データの観測としているため、Rを使っていくつかの計算を実行しています。ファイルはすべて同じ列見出しを持ちます。各ファイルはインポートされ、いくつかの計算が行われ、出力はリストに保存されます。次のファイルがインポートされ、プロセスが繰り返されます。私はこのために、次のコードを使用します。

filelist <- list.files(pattern = "\\.xls") 
universe_list <- list() 

count <- 1 
for (file in filelist) { 
    df <- read.xlsx(file, 1, startRow=2, header=TRUE) 
    *perform calcs* 
    universe_list[[count]] <- df 
    count <- count + 1 
} 

私は今、私が実行したい新しい操作のいくつかは、二つ以上のExcelファイルからのデータを伴うだろう問題を抱えています。たとえば、Jan-16とJan-15のファイルをインポートし、実行する必要があるものを実行し、次のファイルセット(2月16日と2月15日)に移動する必要があります。ファイルは常に固定長である(1年など)

私はこのことを行う方法についてのコードを理解していないようです...プロセスの観点から考えると、1)両方をインポートするループを設計する必要があります2)インポートされたデータから2つのデータフレームを作成する、3)データフレームの1つの列の名前を変更する(したがって列を区別できるようにする)、4)両方のデータフレームを併合する、および4) 。私はこのためのステップ1-4のためのコードを働かせることができません!

答えて

0

ファーストを手伝うため

多くのおかげで、あなたの計算を行うにしたい2つのファイルが互いに連続しているようなあなたのファイルリストを並べ替えます。その後、次のように試してください:

count <- 1 
for (count in seq(1, (len(filelist)),2) { 
      df <- read.xlsx(filelist[count], 1, startRow=2, header=TRUE) 
      df1 <- read.xlsx(filelist[count+1], 1, startRow=2, header=TRUE) 
      *change column names and apply merge or append depending on requirement 
      *perform calcs* 
      *save* 
    } 
1

両方のデータフレームのペアを一緒に処理することを検討してください。あなたの現在のループは実際にはforのループ操作を実行している他の言語とはまったく関係ありません。しかし、Rにはリストを反復する多くのベクトル化手法があります。以下のファイルの両方の15と16年のリストを、両方の対応カ月と同じ長さを前提とし、年間の略称は、右のファイル拡張子(すなわち、-15.xls-16.xls)の前に来る:

files15list <- list.files(path, pattern = "[15]\\.xls") 
files16list <- list.files(path, pattern = "[16]\\.xls") 

dfprocess <- function(x, y){ 
       df1 <- read.xlsx(x, 1, startRow=2, header=TRUE) 
       names(df1) <- paste0(names(df1), "1")   # SUFFIX COLS WITH 1 

       df2 <- read.xlsx(y, 1, startRow=2, header=TRUE) 
       names(df2) <- paste0(names(df2), "2")   # SUFFIX COLS WITH 2 

       df <- cbind(df1, df2)       # CBIND DFs 
       # ... perform calcs ... 
       return(df) 
      } 

wide_list <- mapply(dfprocess, files15list, files16list)   

long_list <- lapply(1:ncol(wide_list),       
        function(i) wide_list[,i])     # ALTERNATE OUTPUT 
関連する問題