【问题标题】:In R: putting similar files in a folder with the same prefix在 R 中:将类似文件放在具有相同前缀的文件夹中
【发布时间】:2019-10-18 16:18:20
【问题描述】:

我有一个文件夹,其中包含为部分人群创建的文件。每个种群创建了 3 个包含数据的不同文件,每个文件以 XXX_ 开头以表示种群,然后在“_”之后指示文件类型(全部后跟 .txt)。 例如: AAA_dat1.txt AAA_dat2.txt AAA_dat3.txt BBB_dat1.txt BBB_dat2.txt BBB_dat3.txt

我已经连续为从我的数据集中提取的每个人口创建了新文件夹(因此在本示例中,我有文件夹 AAA 和 BBB)。我现在希望仅将 AAA_dat1.txt 和 AAA_dat2.txt 移动到文件夹 AAA 和 BBB_dat1.txt 和 BBB_dat2.txt 到文件夹 BBB,将 AAA_dat3.txt 和 BBB_dat3.txt 留在当前文件夹中。由于我将拥有具有不同人口数量的数据集,因此我正在寻找一种不必每次都手动移动每个人口的文件的方法。有没有办法做到这一点?

这就是我创建希望将文件移动到的新文件夹的方法:

newfolders <- c(pops) #pops is the list of populations directly from the dataset

for (j in 1:length(newfolders)){
folder<-dir.create(paste0("~/pathhere/",newfolders[j]))
}

谢谢。

【问题讨论】:

  • 查找目录很容易,gsub("_.*","\\1","AAA_dat1.txt") 之类的东西会得到...但是你怎么知道dat2 应该移动但dat3 没有...是不是 总是不动的“3”?
  • 创建的 3 个文件将始终具有人口代码,后跟 dat1、dat2 或 dat3。 Dat 1 和 dat2 将始终移动到新文件夹,而 dat3 将始终保留在它创建的文件夹中。

标签: r


【解决方案1】:

这是一个镜头:


filenames <- c(
  "AAA_dat1.txt", "AAA_dat2.txt", "AAA_dat3.txt",
  "BBB_dat1.txt", "BBB_dat2.txt", "BBB_dat3.txt"
)

dirs <- gsub("_.*", "", basename(filenames))
dirs
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"

虽然为此生成data.frame 不是绝对必要的,但它使索引和查看内容变得更容易:

moves <- data.frame(
  origpath = filenames, # not basename'd
  newpath = file.path(dirs, basename(filenames))
)[ !grepl("dat3", basename(filenames)), ]
moves
#       origpath          newpath
# 1 AAA_dat1.txt AAA/AAA_dat1.txt
# 2 AAA_dat2.txt AAA/AAA_dat2.txt
# 4 BBB_dat1.txt BBB/BBB_dat1.txt
# 5 BBB_dat2.txt BBB/BBB_dat2.txt

请注意,dat3 文件不在其中。这个框架的目的是重命名(移动)文件,因为我们没有移动它们,所以在这个上下文中我们不需要对它们做任何事情

我们可以一举移动它们:

file.rename(moves$origpath, moves$newpath)

顺便说一句:上面使用basename 是为了处理以下情况:(1)原始文件不在当前目录中,或者(2)您使用了list.files(..., full.names=TRUE)(这样可能会包含完整路径) )。当它们都在当前目录中或其他情况下,它工作得很好,例如

filenames <- c(
  "path1/AAA_dat1.txt", "path1/AAA_dat2.txt", "path99/AAA_dat3.txt",
  "path2/BBB_dat1.txt", "path1/BBB_dat2.txt", "somepath/BBB_dat3.txt"
)
dirs  # derived as above
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"
moves # derived as above
#             origpath          newpath
# 1 path1/AAA_dat1.txt AAA/AAA_dat1.txt
# 2 path1/AAA_dat2.txt AAA/AAA_dat2.txt
# 4 path2/BBB_dat1.txt BBB/BBB_dat1.txt
# 5 path1/BBB_dat2.txt BBB/BBB_dat2.txt

【讨论】:

  • Salmo,这能回答你的问题吗?如果有,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的尽可能多的答案进行投票(如果提供了多个答案)。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2021-08-29
相关资源
最近更新 更多