1

list1 という 1 つのフォルダーにマトリックス 586 *1383 として 4 つのファイルがあり、list2 という別のフォルダーにマトリックスとして他の 4 つのファイルがあります (list1 と flist2 は同じ次元です)。

フォルダ list2 内のファイルに基づいて、フォルダ list1 内のファイルをフィルタリングしたいと思います。したがって、フォルダー list1 ピクセル内の対応するファイルの値が 1000 を超える場合は常に、フォルダー list2 内のファイルの値を NA に置き換えたいと考えています。

:ダウンロードするファイルは次のとおりです。

1-私はこのループを試しましたが、結果を書いたときに奇妙なことがありました。つまり、私のループが正しくないということです。私のループが修正されました。

dir1<- list.files("C:\\list1", "*.img", full.names = TRUE)
dir2<- list.files("C:\\list2", "*.img", full.names = TRUE)
 results<- list()
for (.files in seq_along(dir1)){
      list1 <- readBin(dir1[.files], numeric(), size = 4, n = 1383*586, signed = TRUE)   
      list2 <- readBin(dir2[.files], integer(), size = 2, n = 1383*586, signed = TRUE)                  
      results[[length(results) + 1L]]<- list1[list2 > 1000] <- NA}

     for (i in seq_along(results)){
     fileName <- sprintf("C:\\NewFile%03d.bin", i)
     writeBin(as.double(results[[i]]), fileName, size = 4)}

2-どのコードが間違っているか教えてもらえますか?

4

1 に答える 1

1

上でコメントしたように、問題は次の行にあります。

results[[length(results) + 1L]]<- list1[list2 > 1000] <- NA

NAこの行はlist1[list2 > 1000] に割り当てresults[[length(results) + 1L]]ます。次のように 2 行に分割します。

list1[list2 > 1000] <- NA
results[[length(results) + 1L]] <- list1

また、提案。リストを毎回「成長」させるのは賢明ではありません。リストのサイズはすでにわかっているので、for ループのresults に割り当てることをお勧めします。そうしないと、 を割り当てるたびにresults[[length(results) + 1]]オブジェクト全体がコピーされて別の要素が作成され、リストが長くなるにつれて非常に遅くなります。したがって、それを実装するには、次のようになります。

results <- vector("list", length(dir1)) # create list with required size ( values set to NULL)
> length(results)
# [1] 4

for( i in seq_along(dir1)) {
    # load list1
    # load list2
    # assign NA
    results[[i]] <- list1 # assign using index i, all values of i exists, 
                          # as they are already assigned.
}
于 2013-03-08T14:04:27.733 に答える