我有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 =..
...}
我不确定代码在这里是如何变化的? 没有循环会这样做吗?
该代码适用于单独的文件,但不适用于文件夹中的一批文件。
非常感谢你的帮助!答案 0 :(得分:2)
我认为你真的有两个不同的问题。
第一件事很简单。这是一个可重现的示例,但您可以使用两个文件名列表,这些文件名来自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)