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 =..
...}
我也不确定这里的代码有何变化?
是否可以不循环执行此操作?
该代码适用于单独的文件,但不适用于文件夹中的一批文件。
非常感谢您的帮助!
我认为您确实有两个截然不同的问题。
- 查找匹配列表项
- 在没有 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)
我有 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 =..
...}
我也不确定这里的代码有何变化? 是否可以不循环执行此操作?
该代码适用于单独的文件,但不适用于文件夹中的一批文件。
非常感谢您的帮助!
我认为您确实有两个截然不同的问题。
- 查找匹配列表项
- 在没有 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)