如何将值与文件名匹配?

时间:2015-09-11 09:59:54

标签: r

我在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,可以通过上面的相同行读取。

1 个答案:

答案 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)
  }

如果有人发布了更优雅的解决方案,我也很感激!