【问题标题】:r match filenames in two folders and perform coder 匹配两个文件夹中的文件名并执行代码
【发布时间】:2015-05-20 21:54:14
【问题描述】:

我有 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 =..

...}

我不确定这里的代码是如何变化的? 没有循环可以做到这一点吗?

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

非常感谢您的帮助!

【问题讨论】:

  • list.files 返回文件名向量,即一维对象。为什么 filenames[,1] %in% file_sim[,1] 中有 [,1] 位?我想这会导致错误
  • @arvi1000 抱歉看到我更新的问题。这只是一个例子。我基本上需要为文件夹中的整批文件应用为单个文件设计的代码..

标签: r file directory match


【解决方案1】:

我认为你在这里有两个不同的问题,真的。

  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)

【讨论】:

  • 感谢'intersect'和paste0。我学到了新东西。但是,当我使用它时,它会返回 list() ..这是因为我需要定义多个返回吗?
  • lapply 总是返回一个列表。你在找什么结构?您是否尝试过使用 sapply 或 unlist(lapply(...)) ?
  • unlist(lapply()) 显示“NULL”。并且 sapply 向我展示了“命名列表()”..我的意思是它只是字面上的“列表()”而已。我如何在这个 list() 中看到结果?因为现在看起来为零
  • 也许intersect 正在返回空值,因为这两个列表之间没有共同的项目。但是,您还没有发布您的数据或可重复的示例,因此很难进一步提供帮助。尝试发布一个可重现的示例
  • 我现在才看到错误。我需要相交文件名,即不是内容,因为内容没有任何共同点。 'dna_no' 和 'sim' 必须相同,例如 '112.txt'。文件夹的内容具有相同的名称。感谢您的建议,我将发布我的代码示例。
猜你喜欢
  • 2022-08-21
  • 2011-11-24
  • 2021-12-29
  • 2016-10-19
  • 1970-01-01
  • 2021-05-13
  • 2012-06-06
  • 2018-07-12
  • 2020-08-05
相关资源
最近更新 更多