0

csvファイル(001.csv、002.csv、...、332.csvなど)を含む「specdata」というディレクトリがあります。ここで、関数がこのディレクトリ内のすべてのファイルを読み取り、data.frameを返すようにします。最初の列はファイルの名前で、2番目の列は完全なケースの数です。

例えば:

id nobs
1  108
2  345
...
etc

ここで、「specdata」ディレクトリ内のすべてのファイルを読み取り、各ファイルの完全なケースの合計を生成するこの関数を作成しました。しかし、私はそれぞれの番号を置く方法がわかりません。ループから新しいdata.frameへの「nobs」によって次の形式で生成されます。

id  nobs
1   108
2   345
...
...
332 16

私の機能:

complete <- function(directory, id = 1:332) {

for(i in 1:332)
  {
    if(i<10)
      {

      path<-paste(directory,"/00",id[i],".csv",sep="")
      }
    if(i>9 & i<100)
      {

      path<-paste(directory,"/0",id[i],".csv",sep="") 
      }
    if(i>99 & i<333)
      {

      path<-paste(directory,"/",id[i],".csv",sep="") 
      }  

    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))

  }


}

問題は、「nobs」がforループで行ごとに動的に作成されることであり、すべてのファイルの「nobs」のリスト全体をdata.frameに入れたいと考えています。私は多くの方法を試しましたが、「nobs」のリスト全体を「id」番号とともにdata.frameに入れることができません。

誰かがdata.frameを要求された順序で返す方法を提案できますか?

4

1 に答える 1

0

すべての値のリストを作成する最も簡単な方法は、次のnobsようになります。

complete <- function(directory, id = 1:332) {
  # Create an empty vector outside the for loop
  nobs_vector <- c()
  for(i in 1:332)
  {
    if(i<10)
    {
      path<-paste(directory,"/00",id[i],".csv",sep="")
    }
    if(i>9 & i<100)
    {
      path<-paste(directory,"/0",id[i],".csv",sep="") 
    }
    if(i>99 & i<333)
    {
      path<-paste(directory,"/",id[i],".csv",sep="") 
    }  

    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))
    # Add the value to the end of the vector
    nobs_vector <- c(nobs_vector, nobs)
  }
  # Take a look at the final vector you end up with
  print(nobs_vector)
}

必ずしもエレガントで効率的である必要はありませんが、forループが実行された後も持続する形式でこれらの値を取得します。同様の方法でデータフレームを構築したい場合は、?rbind

于 2013-01-21T04:44:31.243 に答える