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实现优雅循环迭代