【问题标题】:Formatting multiple CSV files in R loop在 R 循环中格式化多个 CSV 文件
【发布时间】:2019-06-19 15:49:47
【问题描述】:

我尝试合并来自 HOBOware 数据记录器的数据,我们每个月左右都会收集数据并一直在 Excel 中编译它们。我正在尝试获取原始 CSV 文件并在 R 中处理它们。我正在努力在循环中正确格式化 CSV

我可以通过

单独格式化每个月
Pool_xxx <- read_csv("Pool_xxx.csv", 
                           col_types = cols(`Date Time, GMT-05:00` = col_datetime(format = "%m/%d/%y %H:%M:%S")), 
                           skip = 1)[,2:4]

但我想创建一个循环来执行文件夹中的每个 CSV

我已经阅读了很多关于如何循环的帖子,但我不知道在哪里放置列规范

setwd("E:/R Hobo/Conversion test/Converted HOBO files")
mydir = "Pool 6"
myfiles = list.files(path=mydir, pattern="*.csv", full.names=TRUE)
numfiles <- length(myfiles)     
for (numfiles in myfiles) {
      sample <- read.csv(numfiles,
                          header = FALSE,
                          sep = ",",
                          col_types = cols(`Date Time, GMT-05:00` = col_datetime(format = "%m/%d/%y %H:%M:%S")),  
                          skip = 1) [,2:4]
}

我不断收到这个,但我不知道该去哪里

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  unused argument (col_types = cols(`Date Time, GMT-05:00` = col_datetime(format = "%m/%d/%y %H:%M:%S")))

有人建议 lapply 但 R 一直说它与 3.5.3 版本不兼容

原始 CSV 链接:https://drive.google.com/file/d/1SUf--PNznlNOlDkXeXYaRKuSHqa-EVZM/view?usp=sharing

【问题讨论】:

  • 在您的第一个块中,您使用来自readr 包的read_csv。在您的循环中,您使用来自 base R 的read.csv。将点更改为下划线。
  • 另外,循环的设置方式,sample 每次迭代都会被覆盖。相反,将数据放入list。在循环之前,初始化sample &lt;- list()。然后,在循环中,使用sample[numfiles] &lt;- read_csv...
  • 另一个注意事项,您使用了两次numfiles。您首先将其定义为带有numfiles &lt;- length(myfiles) 的整数,第二次将其定义为带有文件名的字符串。

标签: r csv dataframe import


【解决方案1】:

您在第一个代码块中使用readr::read_csv,但在第二个代码块中您已切换到read.csv,它是base 的一部分并且具有不同的参数。只需将read_csv 替换为sample &lt;- read_csv(numfiles, 即可解决此问题。

恐怕我每天都在使用 R3.4.4,所以我不知道这个 lapply 问题。但是,每次迭代循环时,您编写的代码都会覆盖样本——在该块的末尾,sample 将包含从最后一个 csv 读取的值。这是一个替代方案(尽可能多地保留其他代码):我们从第一个文件创建sample,然后在每次循环时,我们将它与从下一个文件读取的数据结合起来(参见@987654329 @ 了解更多关于 dplyr 函数的信息)。

library(dplyr)
library(readr)
setwd("E:/R Hobo/Conversion test/Converted HOBO files")
mydir = "Pool 6"
myfiles = list.files(path=mydir, pattern="\\.csv$", full.names=TRUE)
# numfiles <- length(myfiles)

# You want sample to exist before the loop, so you can union the new content with the existing object
sample <- read_csv(myfiles[1],
                   col_types = cols(`Date Time, GMT-05:00` = col_datetime(format = "%m/%d/%y %H:%M:%S")),  
                   skip = 1) %>% select(2:4)

for (numfiles in myfiles[-1]) { # numfiles as referenced here, and in the block below, is independent of the assignment you make above; myfiles[-1] removes the first element used above.
    sample <- union_all(sample,
                        read_csv(numfiles,
                                 col_types = cols(`Date Time, GMT-05:00` = col_datetime(format = "%m/%d/%y %H:%M:%S")),  
                                 skip = 1) %>% select(2:4))
}

我在这里做了一些其他小的修复和更改。您在list.files 中的模式有效,但该参数需要一个正则表达式,所以这应该更接近我认为您想要的。我删除了headersep 参数,它们转到read.csv,而不是read_csv。最后,我使用dplyr::select 来代替[ 抓取列——read_csv 返回tibble,并且select 可以更好地发挥作用;不幸的是,列名有点难以使用,所以我仍然按索引选择它们。

你没有提供一个我可以实际测试的例子,因为我没有你正在读取的文件,所以我无法测试这个,但它应该可以工作。

【讨论】:

  • 抱歉,谢谢,您提供的代码选择了两次列,我已使用原始 CSV 更新帖子。如果有影响,我在 Rstudio 中
  • RStudio 不应该对这么简单的 cse 产生太大影响。我将尝试使用该文件,看看这里发生了什么。 “选择列两次”是指添加更多列,还是复制行/数据?
  • 它应该读出第 2-4 列,但我认为它做了两次(2-4 列中的 2-4 列)。通过查看时,它仅显示其中一列(变量)
  • 对不起,您的代码有效,我没有检查我是否安装了 dplyr。非常感谢您
  • 不,很乐意为您提供帮助!如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2020-12-27
  • 2021-11-27
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多