我是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
答案 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行标题。)