我在一个名为list1的文件夹中有4个文件作为矩阵586 * 1383,在另一个名为list2的文件夹中有4个文件作为矩阵(list1和flist2具有相同的尺寸)。
我想根据文件夹list2中的文件过滤文件夹list1中的文件。因此,只要文件夹list1像素中的相应文件的值大于1000,我就想用NA替换文件夹list2中的文件中的值。
:以下是要下载的文件:
1-我试过这个循环但是当我写了结果时我得到了一些奇怪的东西,这意味着我的循环不正确,结果是大小为1kb的文件而不是矩阵(正确的大小应该是3166kb)。我很感激任何帮助我的循环得到纠正。
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-有人能告诉我哪些代码有误?
答案 0 :(得分:1)
正如我上面评论的那样,问题出在以下几行:
results[[length(results) + 1L]]<- list1[list2 > 1000] <- NA
此行将NA
分配给list1[list2 > 1000]
和 results[[length(results) + 1L]]
。我会把它们分成两行:
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.
}