r匹配两个文件夹中的文件名并执行代码

时间:2015-05-20 21:54:14

标签: r file directory match

我有2个带文本文件的文件夹:Aba有90个文件,Baa有50个文件。我有一段代码,我从两个文件夹中打开具有相同名称的文件并执行操作。

dna_no= read.table("/home/Documents/Baa/112.txt",skip=1, header=TRUE, sep="\t", fill=FALSE)
sim = read.table("/home/Documents/Data/Aba/112.txt",header=FALSE, sep="\t")

然后我想对文件内容执行代码:

从sim中选择行,其中第一列dna_no与第一列sim匹配:

sm_dna=  sim[which(dna_no[,1]%in%sim[,1]),]
sim_nn17 = cbind(sm_dna[,1],sm_dna[,4:6]

现在我想一次性为Baa中的所有文件执行此操作,查找来自Aba的同名文件并执行上述操作。

我正在使用list.files:

filenames= list.files("/home/Documents/Baa/", full.names=TRUE)

file_sim= list.files("/home/Documents/Data/Aba/",full.names=TRUE)

ldf <- lapply(filenames, function(x) read.table(x,skip=1))
tcf <- lapply(file_sim, function(z) read.table(z,colClasses = c(rep("numeric", 6), rep("NULL", 1)),header=FALSE, sep="\t"))

所以现在我需要找到tcf [i]中相同的ldf [i],即具有相同名称的文件(例如112个文件名都是数字),我无法弄清楚如何将其作为list.files似乎不是安全的文件名。

然后为每个文件执行代码。

myFun <- function(filenames){

上述每个文件的相同操作:

sm_dna=  ..

sim_nn17 =..

...}

我不确定代码在这里是如何变化的? 没有循环会这样做吗?

该代码适用于单独的文件,但不适用于文件夹中的一批文件。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我认为你真的有两个不同的问题。

  1. 查找匹配列表项
  2. 对没有for-loop的一系列文件执行某些操作
  3. 第一件事很简单。这是一个可重现的示例,但您可以使用两个文件名列表,这些文件名来自list.files或此处的任何内容

    # here are two random vectors of letters
    set.seed(1)
    vec1 <- letters[sample(1:26, 5)]
    vec2 <- letters[sample(1:26, 15)]
    
    # > vec1
    # [1] "g" "j" "n" "u" "e"
    # > vec2
    # [1] "x" "z" "p" "o" "b" "e" "d" "n" "g" "s" "h" "k" "q" "u" "j"
    
    # here are the matching ones 
    intersect(vec1, vec2)
    # [1] "g" "j" "n" "u" "e"
    

    第二件事也很简单:从不同位置读取两个同名文件,执行一些操作:

    my_func <- function(filename) {
    
      # get files with same name from two dirs
      dna_no <- read.table(paste0('/home/Documents/Baa/', filename))
      sim <- read.table(paste0('/home/Documents/Data/Aba/', filename))
    
      # do other stuff...
    }
    

    将这些放在一起你可以做类似的事情:

    filenames <- list.files("/home/Documents/Baa/")
    file_sim <- list.files("/home/Documents/Data/Aba/")
    
    lapply(intersect(filenames, file_sim), my_func)