【问题标题】:How to modify i in an R loop?如何在 R 循环中修改 i?
【发布时间】:2016-11-28 01:20:07
【问题描述】:

我有几个大型 R 对象保存为 .RData 文件:“this.RData”、“that.RData”、“andTheOther.RData”等。我没有足够的内存,所以我想循环加载每个,提取一些行,然后卸载它。然而,一旦我加载(i),我需要剥离(i)的“.RData”部分,然后才能对对象“this”、“that”、“andTheOther”进行任何操作。我想做与How to iterate over file names in a R script? 中描述的相反的事情我该怎么做?谢谢

编辑:我没有提到文件不在工作目录中并且也有文件路径。我遇到了Getting filename without extension in R 并且 file_path_sans_ext 取出了扩展名,但路径的其余部分仍然存在。

【问题讨论】:

  • 你可以使用gsub
  • 您能详细说明一下吗? FWIW,新手在这里...
  • 你想替换字符串的一部分。这就是 gsub 的用途。你可以做gsub(".RData","",i) 来替换你不想要的部分。查看?gsub 了解更多示例。
  • 我很困惑,从什么中剥离?请给我们看一些东西。加载 RData 后,原始命名对象保留 - 不是具有 .RData 扩展名的文件名。
  • @Parfait 如果使用循环加载保存的对象 A.Rdata、B.Rdata、C.Rdata,则环境中有对象 A、B 和 C。要使用这些对象,(i) 需要将 for 循环中的 (i) 修改为仅读取 A、B 或 C,删除“.Rdata”部分。就我而言,我也有不同的路径指向不同的项目目录,这些目录也需要被删除,下面用户 Ott 的回答显示了如何。

标签: r for-loop paste


【解决方案1】:

你的意思是这样的吗?

i <- c("/path/to/this.RDat", "/another/path/to/that.RDat")
f <- gsub(".*/([^/]+)", "\\1", i)
f1 <- gsub("\\.RDat", "", f)
f1
[1] "this" "that"

在 Windows 的路径上,您必须使用 "\\" 而不是 "/"

编辑:解释。从技术上讲,这些被称为“常规 表达式”(正则表达式),而不是“模式”。

  • .任意字符

  • .*任意数量(包括0)任意字符

  • .*/ 任意数量的任意类型的字符,后跟一个 /

  • [^/] 任何字符,但不是/

  • [^/]+任意数量(1个或更多)任何类型的字符, 但不是/

  • () 包含组。您可以在以下情况下使用组 替换为\\1\\2等。

所以,查找任何类型的字符,然后是 /,然后是 除了路径分隔符之外的任何内容。将此替换为“任何 但不是分隔符”。

关于正则表达式的教程有很多,随便找吧。

【讨论】:

  • 谢谢。我不会假装完全理解 .*/([^/]+)", "\\1" 中的每个元素都在做什么,但我可以看到整体是“模式匹配”多个模式,使用一系列通配符。
  • 感谢您的解释编辑。与让我彻底困惑的 ?gsub 相比,简单的英语帮助极大且更易于理解。
  • 请在 cmets 中查看我对原始问题的注释。我发现您的编辑解释非常有用,但 this 更...预先消化了!
【解决方案2】:

执行此操作的一种简单方法是使用 base::basename() 从文件路径中提取基本名称,然后使用 tools::file_path_sans_ext() 删除文件扩展名。

paths_to_files <- c("./path/to/this.RData", "./another/path/to/that.RData")

tools::file_path_sans_ext(
  basename(
    paths_to_files
  )
)

## Returns:
## [1] "this" "that"

【讨论】:

  • 这很有用。我可以在清理时避免额外的 rm(Objs) 从我现在拥有的:'rdatafiles ' 仍然不清楚为什么投反对票...
猜你喜欢
  • 2023-03-14
  • 2021-08-11
  • 2013-11-13
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多