2017-11-28 5 views
0

私はベクトル操作を含むカスタム関数を作成しようとしています。この機能は、手動でパスとデータ名を入力した後にうまく機能します。各文書は、1つの列に数字だけを含む.txtファイルです。 しかし、フォルダには多数のファイルがあります。私の質問は、どのように私の関数をすべての.txtファイルでループすることができますか?フォルダを介して関数をループする

このコードを使用しようとしましたが、何もしません。ここで

filenames <- list.files(path=("/folder/"), pattern=".txt") 
ldf <- lapply(filenames, read.table) 
lapply(ldf, sumfun) 

コード

dataframe <- read.table('folder/dataframe.txt') 
    sumfun <- function(a){ 
     x <- dataframe[1:length(dataframe)-1] 
     y <- dataframe[-1] 
     dx <- y-x 
     SUM1 <- sum(dx[which(dx>1)]))^2 
     SUM2 <- sum(dx[which(dx<1)]))^2 
     SUMtot <- SUM1 + SUM2 
     return(SUMtot) 
    } 

sumfun(dataframe) 

のsimplyfiedバージョンでは、私はそれを理解し、問題はxとyのベクトル操作であるかもしれない?ですか

+0

'適用'機能を試しましたか?私はまた、印刷文を差し込み、何が起こっているのかを確認することをお勧めします。 –

+0

関数内の 'dataframe'を' a'で置き換える必要があります。 'x < - a [1:length(a)-1]'です。今では、関数内で入力変数を使用しません。 – LAP

答えて

1

問題はあなたの機能にあります。引数をaと定義しますが、代わりにdataframeを使用します。 sum()操作には、さらに)があります。

sumfun <- function(a){ 
    x <- a[1:length(a)-1] 
    y <- a[-1] 
    dx <- y-x 
    SUM1 <- sum(dx[which(dx>1)])^2 
    SUM2 <- sum(dx[which(dx<1)])^2 
    SUMtot <- SUM1 + SUM2 
    return(SUMtot) 
} 

さらに、作業ディレクトリが同じ場所にないと、ファイル名によって問題が発生する可能性があります。次のように追加されます:

filenames <- list.files(path=("/folder"), pattern=".txt", full.names = T) 
+0

ありがとうございます。 最初のコードで実行した後: 'ファイル名< - list.files(path =("/folder/")、pattern =" .txt ") ldf < - lapply(ファイル名、read.table) lapply エラーが発生しました: '行列のエラー(unlist(値、再帰= FALSE、use.names = FALSE)、nrow = nr、: 'data'はベクトル型でなければなりません。 'NULL'でした。 –

+1

私が言ったように、読み込みコマンドを 'filenames < - list.files(path =("/folder ")、pattern ="。txt "、full.names = T)'に変更する必要があります。 –

関連する問題