R、R 编程、循环目录

Posted

技术标签:

【中文标题】R、R 编程、循环目录【英文标题】:R, R Programming, Loop Directory 【发布时间】:2013-07-22 19:19:28 【问题描述】:

您好,我正在尝试遍历一个 excel 文件目录进行分析。

我的变量名为 FileToGrab,它获取 excel 文件的名称。

我有粗体的 FileToGrab 是我希望将数据框命名为不是实际的 FileToGrab 数据框。

示例 FileToGrab = 2013ExcelSheet23

我希望我的数据框命名为 2013ExcelSheet23 而不是 FileToGrab。

FileToGrab = 2013ExcelSheet24

我希望我的数据框命名为 2013ExcelSheet24 而不是 FileToGrab。

FileToGrab = 2013ExcelSheet25

我希望我的数据框命名为 2013ExcelSheet25 而不是 FileToGrab。

.....等等。

如果这没有意义,R 的新手很抱歉。谢谢

x <- 1:50
for(i in seq(along=x))



FileToGrab  = gsub("(^ +)|( +$)", "",listofFile[i])
FileToGrab  = str_replace_all(string=FileToGrab, pattern=" ", repl="")

DirFileName = paste("C:\\Users\\w47593\\Desktop\\RProjects\\CallCenterProjectJuly2013\\Files\\",FileToGrab)
DirFileName = str_replace_all(string=DirFileName, pattern=" ", repl="")

file.name <- DirFileName 
sheet.name <- "Detail"
FileToGrab = str_replace_all(string=FileToGrab, pattern=".xls", repl="")


## Connect to Excel File Pull and Format Data
excel.connect <- odbcConnectExcel(DirFileName)
**FileToGrab**  <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-"))
odbcClose(excel.connect)



【问题讨论】:

...我不确定,但是以数字开头的文件名可能不适合作为 R 中的标识符;但是,assign() 函数可能会帮助您将结果填充到一系列变量中,这些变量的名称在执行期间已确定(因此您可能需要类似于 assign(sprintf(".Sheet.%s",FileToGrab), sqlFetch(...)) 的内容)。 【参考方案1】:

您可能希望以数字开头的对象命名,因为每次使用它们时都必须引用它们

> 11Foo <- 1
Error: unexpected symbol in "11Foo"
> `11Foo` <- 1
> 11Foo
Error: unexpected symbol in "11Foo"
> `11Foo`
[1] 1

同样,我怀疑您是否希望 25 多个对象堵塞您的工作区。更好的解决方案通常是将数据导入列表并使用这些对象。您在访问名称时遇到了类似的问题

> ll <- list(`1` = 1, `2` = 2)
> ll$1
Error: unexpected numeric constant in "ll$1"
> ll$`1`
[1] 1

但是您不一定需要按名称引用它们,并且您可以通过使用 lapply 等迭代列表而受益。

我会使用类似的东西

fs <- list.file("dir/to/excel/files", glob2rx("*.xls"))
ll <- vector(mode = "list", length = length(fs))

for (i in seq_along(ll)) 
  excel.connect <- odbcConnectExcel(fs[i])
  ll[[i]] <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-"))
  odbcClose(excel.connect)


names(ll) <- sub("\\.xls", "", fs)

你仍然需要通过提取

ll$"2013ExcelSheet25"

但你也可以使用

ll[["2013ExcelSheet25"]]

或更好

ll[[1]]

甚至

ll[[which(names(ll) == "2013ExcelSheet25")]]

但是因为这些都在一个列表中,所以你可以通过lapply 和 co 对它们进行操作。

【讨论】:

【参考方案2】:

为什么不使用

files = list.files(DirFileName)

然后遍历它以将它们加载到 R 中?

使用文件名分配给对象:

objects = list()
objects[[files[1]]] = ...

【讨论】:

你想要什么,来一波掌声?我一注意到你更新了你的答案,我就删除了我的评论。您的回答很简洁,我的回答更接近完整的解决方案,并带有一些警告/解释。两者都会帮助OP,那么愚蠢的态度是什么? 我没有偷猎!在仅仅凭借时间戳和帖子的长度得到答复之前,我显然已经在研究我的问题了。当你的两行答案弹出时,我已经有效地完成了我的任务,但没有回答实际问题。同时,您编辑了您的答案,我在添加了一些内容后发布了我的答案。如果我认为你的答案更好,我会删除我的(到***.com/a/17797415/429846,答案都是同时处理的,但我没有提供任何新的答案,因此我删除了它)。 如果你认为Stack Overflow 是一场看谁先回答的竞赛,那么你会失望的。它是关于提供除了帮助原始 OP 之外广泛有用的好的答案。长大了! 很公平。撤回批评

以上是关于R、R 编程、循环目录的主要内容,如果未能解决你的问题,请参考以下文章

R语言问题剖析20篇-R语言泛函式编程purrr实现优雅循环迭代

R语言问题剖析20篇-R语言泛函式编程purrr实现优雅循环迭代

R语言 循环

R编程:循环后保存三维输出

R学习笔记 第四篇:函数,分支和循环

R:保存循环的结果