-1

40個のファイルを含むフォルダーがあります(ただし、これは常に発生するため、任意の数のファイルで機能するようにコードを記述したいと思います)。私がやりたいことは、これらすべてのファイルを列としてまとめてコンパイルする新しいファイルを取得することだけです。各ファイルには、それぞれ 902 行の 5 つの列が含まれています。

これは私が書いたものです:

Specs2 <- function() 
{
  allspecs2 <- NULL
  fnames2 <- scan(file.choose(), what = "character", quiet = TRUE)
  print(fnames2)
  for (i in fnames2) 

  {
    dat2 <- read.table(paste("E:\\Post-doc Data\\Colour-   Temperature\\Compiled Sets Rows\\",i, sep=""))
    value <- data.frame(dat2)
    allspecs2 = cbind(allspecs2, value)
  }

  allspecs2 <- data.frame(allspecs2)

  write.table(allspecs2, "E:\\Post-doc Data\\Colour-   Temperature\\Colour-Temperature_Columns.csv", row.names = FALSE, quote = FALSE)
}

Specs2()

ファイルを選択するように求められたら、コンパイルするフォルダー内のすべてのファイルのリストを含むファイルを選択します。このコードを実行すると、次のエラー コードが表示されます。

"Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 902"

しかし、コンパイルしているすべてのファイルの行と列の数は同じです。このエラーが発生する理由や修正方法を知っている人はいますか? または同じことを達成するためにそれをコーディングする別の方法はありますか?

ありがとうございました!

編集:MrFlicksの回答を読んだ後、彼のコードが機能する理由を理解しましたが、以前に同じタイプのコードを使用して成功しました:

Specs1 <- function() 
{
  allspecs1 <- NULL
  dirnames <- scan(file.choose(), what = "character", quiet = TRUE)
  print(dirnames)
  for (j in dirnames) 

{ 
 fnames1 <- list.files(path = paste("E:\\Post-doc Data\\Colour-Temperature\\Specs\\",j, sep = ""), pattern = NULL, all.files = FALSE, 
                      full.names = FALSE, recursive = FALSE,
                      ignore.case = TRUE, include.dirs = FALSE, no.. = FALSE)
print(fnames1)
for (i in fnames1) 

    {
      dat1 <- read.table(paste("E:\\Post-doc Data\\Colour-Temperature\\Specs\\",j,"\\",i, sep=""), skip = 17)
      smoothed <- ksmooth(dat1[,1], dat1[,2], kernel = "box", bandwidth = 10, x.points = seq(300, 2100, 2))
      allspecs1 = cbind(allspecs1, smoothed$y)          
    }

    allspecs1 = cbind(smoothed$x, allspecs1)
    allspecs1 <- data.frame(allspecs1)
    write.table(allspecs1, paste("E:\\Post-doc Data\\Colour-Temperature\\Compiled Sets Rows\\",j, ".txt"), row.names = FALSE,     col.names = FALSE, quote = FALSE)
    rm(allspecs1)
    allspecs1 = NULL  
  }
}

Specs1()

なぜそれが機能するのか、他の機能が機能しないのかを理解したいだけですか?

ありがとうございました!

4

1 に答える 1

0

これがそのエラーを返すのと同じ理由で、そのエラーが発生します

cbind(NULL, data.frame(a=1))
# Error in data.frame(..., check.names = FALSE) : 
#   arguments imply differing number of rows: 0, 1

定義することから始め、最初の data.frame をその null 値に移動すると、エラーが発生しますallspecs2 <- NULLcbind

allspecs2cbind する前に、行/列があるかどうかを確認することをお勧めします。どうですか

Specs2 <- function() 
{
  allspecs2 <- NULL
  fnames2 <- scan(file.choose(), what = "character", quiet = TRUE)
  print(fnames2)
  for (i in fnames2) {
    value <- read.table(paste("E:\\...\\",i, sep=""))
    if ( is.null(allspecs2) ) {
        allspecs2 <- value
    } else {
        allspecs2 <- cbind(allspecs2, value)
    }
  }
  write.table(allspecs2, "E:\\...\\file.csv", row.names = FALSE, quote = FALSE)
}

Specs2()
于 2014-06-06T04:33:17.627 に答える