将带有时间序列的大型混合CSV导入R中

时间:2018-04-03 23:43:29

标签: r time-series workflow

我是R的首发,并且一直在为网站寻找答案,但我的具体问题没有运气。

基本上我需要导入大约15个CSV文件并对每个文件进行处理(绘图和分析)。它们每个都包含数千个条目,并且是时间序列,每个条目有15-20个样本。格式是顶部有日期,以及我需要保留的顶行上的其他列名,然后是需要通过导入保留的百分比数字。

到目前为止,我已经研究了如何导入,处理和清理,但是所有内容都存储为字符,但我失去了重要数据。

我真的希望对工作流程和合适的导入处理函数提出一些建议,因为我需要保留名称的日期和第一列(我可以存储为索引向量或数据框),然后处理数据本身(这样我可以单独绘制,或以总结的组合绘制)。

对此提出任何建议(包括有系统地处理此问题的良好工作流程)将不胜感激。我一直在使用“readr”和基本函数,但每次运行第一次导入时,我都无法解决数据被转换为我需要避免的字符的问题,尽管我还需要保留日期。

有没有办法通过一些奇妙的R技术,或者我是否需要首先预先格式化这些许多恶劣的CSV文件?

image of what I am dealing with, if it were multiplied by many many times in both directions

1 个答案:

答案 0 :(得分:1)

如果您的文件格式相同,那么您可以跳过"跳过"行来把事情搞定。在您的图片示例中,我推断数据看起来像这样,并且在一个文件中读取的代码就是:

dat <- read.csv(text='NAME,% Outstanding,% Outstanding,% Outstanding
,31/12/2018,31/12/2017,31/12/2015
Name01,0.1,0.2,0.3
Name02,0.4,0.5,0.6',
header=TRUE, stringsAsFactors=FALSE, skip=1)
dat
#        X X31.12.2018 X31.12.2017 X31.12.2015
# 1 Name01         0.1         0.2         0.3
# 2 Name02         0.4         0.5         0.6

我选择跳过最上面的一个,因为大多数名字都是多余的,并没有真正的帮助。请注意,这些名字被点了一点;有关R强制执行的列命名规则,请参阅?make.names

从这里开始,虽然有点偏好,但我强烈建议您从&#34; wide&#34;到&#34; tall&#34;格式。有两个原因,至少:(1)列名实际上是数据,因为您可能希望/需要知道从一批数据到另一批数据是相隔1年&#34 ;; (2)许多工具,例如ggplot2甚至基本图形(使用formula方法)都更喜欢高大的方法。

我会使用tidyverse中的一些,并解决第一个问题:

colnames(dat)[1] <- "Name"

library(dplyr)
library(tidyr)

首先,关于从高到高的说明:

gather(dat, date, pct, -Name)
#     Name        date pct
# 1 Name01 X31.12.2018 0.1
# 2 Name02 X31.12.2018 0.4
# 3 Name01 X31.12.2017 0.2
# 4 Name02 X31.12.2017 0.5
# 5 Name01 X31.12.2015 0.3
# 6 Name02 X31.12.2015 0.6

这带来了&#34; date&#34;进入数据领域。事实上,他们有点(无损)是好的,我们可以通过下一步来解决这个问题:

gather(dat, date, pct, -Name) %>%
  mutate(
    date = as.Date(date, format = "X%d.%m.%Y")
  )
#     Name       date pct
# 1 Name01 2018-12-31 0.1
# 2 Name02 2018-12-31 0.4
# 3 Name01 2017-12-31 0.2
# 4 Name02 2017-12-31 0.5
# 5 Name01 2015-12-31 0.3
# 6 Name02 2015-12-31 0.6

从这里开始,为多个文件执行此操作应该是:

filelist <- list.files("/path/to/mydir/", pattern="*.csv")
alldata <- lapply(filelist, read.csv, header=TRUE, stringsAsFactors=FALSE, skip=1)
alldata2 <- lapply(alldata, function(dat) {
  gather(dat, date, pct, -Name) %>%
    mutate(date = as.Date(date, format = "X%d.%m.%Y"))
})
combineddata <- do.call(rbind.data.frame, alldata2)

(假设所有文件都有相同的2行标题。)