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

r match filenames in two folders and perform code

我有 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")

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

Select 来自 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. 查找匹配列表项
  2. 在没有 for 循环的情况下对一系列文件执行一些操作

第一件事很简单。这是一个可重现的示例,但您可以使用来自对 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)