我在dir1
中有一个文件,其名称如下:File_01_02_2013.img
我在其他文件夹dir2
中有其他文件,其名称如下:
File_01_02_2013_00.img
File_01_02_2013_01.img
我在a matrix
中有一个文件dir1
,但在dir2
中有24个文件。
我需要的是:
00 …>>>> File_01_02_2013_00.img >>>> 4 >>>> put in the new matrix `out_01_02_2013_.img`
要在dir1中读取文件:
con <- file("C:\\dir1\\ File_01_02_2013.img", "rb")
pva<- readBin(con, numeric(), size=4, n=1000*500)
dat <- matrix((data=pva), ncol=500, nrow=1000)
读取dir2中的文件:
这24个文件与dim
具有相同的File_01_02_2013.img
,可以通过上面的相同行读取。
答案 0 :(得分:1)
sgibb是正确的,如果dir2
中的文件名包含00到23之间的所有值,那么要访问说文件...04.img
,您需要打开dir2
中的第五个文件名单。
因此假设您获得了数据矩阵中的第一个值
val <- dat[1,1]
且val
等于4,然后您可以使用readBin(dir2[[val + 1]]...
访问第五个文件(如果dat
中的值是数字。如果不是,则必须转换它按照sgibb的评论中的数字。
现在,当您的意思是&#34;提取相应的值&#34;时,您的意思是使用您用于获取上述val
的索引吗?那么你想加载dir2
文件,然后从中获取值[1,1]
吗?然后取出该值并将其放入[1,1]
的最终矩阵中?
修改强>
澄清之后,你可以做一件事(不是很优雅):
nrows <- 1000
ncols <- 500
outmat <- matrix(,nrows,ncols)
for (nr in 1:nrows){
for(nc in 1:ncols{
val <- dat[nr,nc]
dir2file <- readBin(dir2[[val + 1]], numeric(), size=4, n=1000*500)
dir2val <- dir2file[nr,nc]
outmat[nr,nc] <- dir2val
}
}
编辑#2
这里试图遍历整个数据集。由于您没有提供任何样本数据,因此我无法测试此代码,因此无法保证无需调试即可。但也许你很幸运;-)
dir1 <- list.files("C:\\dir1", "*.img", full.names = TRUE)
dir2 <- list.files("C:\\dir2", "*.img", full.names = TRUE)
# get a list of strings of just the file names
dir1str <- list.files("C:\\dir1", "*.img", full.names = FALSE)
nrows <- 1000
ncols <- 500
for (fileInd in length(dir1)){
# read in file 1 of dir1 (copied from your code)
pva<- readBin(dir1[[fileInd]], numeric(), size=4, n=1000*500)
dat <- matrix((data=pva), ncol=500, nrow=1000)
# retrieve the file name of dir1
dir1strfile <- dir1str[[fileInd]]
# split the string at the underscores (_)
file.attr <- unlist(strsplit(dir1strfile,"_"))
# Paste the strings back together to get File_date
fdate <- paste0('File_',file.attr[2],'_',file.attr[3])
# Get indeces of files in dir2 that match the date
dir2date <- grep(fdate,dir2)
dir2lst <- dir2[dir2date]
# pre-allocate output matrix
outmat <- matrix(NA,nrows,ncols)
# now loop through the dir1 file, and save the outmat as a csv
for (nr in 1:nrows){
for(nc in 1:ncols){
val <- dat[nr,nc]
dir2file <- readBin(dir2lst[[val + 1]], numeric(), size=4, n=1000*500)
outmat[nr,nc] <- dir2file[nr,nc]
}
}
# you probably have to turn the '/' into a '\' below
outname <- paste0(dir2, '/' ,fdate,'_output.csv')
write.csv(outmat,outname)
}
如果有人发布了更优雅的解决方案,我也很感激!