【问题标题】:R: Plotting multiple csv files independently in one time series plot (also importing csv files with conditions)R:在一个时间序列图中独立绘制多个 csv 文件(也可以导入带条件的 csv 文件)
【发布时间】:2018-01-11 19:32:24
【问题描述】:

我试图以时间序列图结束,将不同城市与 center 数据(数据框)进行比较。其中 center 是 R studio 中的数据框对象,我已经导入了。

我有一个包含 165 个 csv 文件的文件夹,每个文件代表一个城市。我想在一个图中绘制所有 165 个 csv 文件(作为独立名称/数据框)加上 center 数据框。

我希望它看起来像这样:(x 轴是时间,y 轴是 CO,所有颜色都是纯色。

我想对每个 csv 文件执行四件事,但最后,让这四项操作自动对 165 个 csv 文件中的每一个执行。

1) 跳过 csv 文件的前 25 行

2) 合并每个 csv 文件的日期和时间列

3) 删除第 3 列单元格值为空的行

4) 将第 3 列的名称从 ug/m3 更改为 CO

我希望它以自动方式对 165 个 csv 文件中的每一个执行四个操作。然后,能够在一个图中有效地绘制新更新的 csv 文件。

我在一个 csv 文件上使用了下面的代码,看看它是否适用于一个 csv。我不确定如何以有效的方式组合所有内容。实现这一点:

city1 <- read.csv("path",
                        skip = 25)

city1$rtime <- strptime(paste(city1$Date, city1$Time), "%m/%d/%Y %H:%M")

colnames(city1)[3] <- "CO"

city[,3][!(is.na(city[,3]))] ## side note: help with this would be appreciated, I was unsure of what goes before the comma.

总的来说,我想要一个像上面那样包含所有 165 个城市(csv 文件)的图。我需要帮助将四个动作放在每个 csv 文件上并将它们全部绘制在一个图中。

对于剧情, 我是这样做的一个例子:

ggplot(center, aes(rtime, CO)) + geom_smooth(aes(color="Center"))+
  geom_smooth(data=city1,aes(color="City1"))+
  labs(color="Legend")

更新: 每个城市的 csv 文件似乎已经合并为一行。我不确定我是否可以发布确切的输出,但它看起来像下面的:粉红色的线是城市,蓝色的线是 center.x 轴时间和y 轴是 CO。我希望这会有所帮助。

unique(df.cleaned$cities)的结果

> unique(df.cleaned$cities)
 [1] "WFH4N_YEK04_PORTLAND_08AUG16_R1"
 [2] "WFH2N_QIM23_AUSTIN_30JUL16_R1" 
 [3] "WFH7N_QIM70_NEWYORK_20JUL16_R1"
 [4] "WFH3N_YEK28_NAMPA_23AUG16_R1"
 [5] "WFH9N_YEK18_MESA_12JUL16_R1"
 [6] "WFH6N_QIM10_OAKLAND_11AUG16_R1"
 [7] "WFH3N_YEK01_DETROIT_30AUG16_R1"
 [8] "WFH6N_YEK05_ATLANTA_30AUG16_R1"
 [9] "WFH1N_YEK32_LONGBEACH_01JUL16_R1"
[10] "WFH8N_YEK39_LOSANGELES_30AUG16_R1"
[11] "WFH5N_YEK59_BALTIMORE_31AUG16_R1"
[12] "WFH1N_QIM19_MEMPHIS_01JUL16_R1"
[13] "WFH0N_YEK2087_DENVER_09JUL16_R1"
[14] "WFH4N_QIM43_CLEVELAND_30AUG16_R1"
[15] "WFH8N_QIM65_HARTFORD_30AUG16_R1"
[16] "WFH2N_YEK66_SEATTLE_30AUG16_R1"
[17] "WFH0N_YEK17_SANJOSE_30AUG16_R1"

【问题讨论】:

  • 要自动化读取 165 个 csv 文件的部分,您可以获得所有 csv 文件名的字符向量,然后对文件名执行 lapply。例如file_names &lt;- list.files(path ="your folder path", pattern = ".csv") 获取文件名,然后lapply(file_names, FUN = function(file){...})
  • 使用我发布的正则表达式,所有这些都将解析为“”,因为您的城市名称是大写的,而不是您给出的示例中的标题大小写。如果您不尝试提取城市名称,而是像那样保留该列cities,则您的绘图应该有单独的行,如aes(colour = cities) 给出的那样。那部分工作正常吗?
  • @Brian 当我意识到我给出的示例不同时,我决定不尝试正则表达式。没有添加正则表达式,它仍然给了我一行。
  • 如果没有一些示例数据,恐怕我无法重现该错误。你能分享 1-2 个 CSV 还是它们太大了?

标签: r csv ggplot2 import time-series


【解决方案1】:

这是一个完整的tidyverse 解决方案,所以基本的 R 传统主义者,现在别看。

library(dplyr)
library(purrr)
library(tidyr)
library(readr)
library(stringr)
library(lubridate)
# or just library(tidyverse)

df <-
  data_frame(files = list.files(path = "./yourfilepath",    
                                pattern = "csv", 
                                full.names = T)) %>%
    mutate(dfs = map(files, read_csv, skip = 25)) %>%       
    unnest() %>% 
    mutate(cities = str_replace_all(files, "./yourfilepath/", ""),
           cities = str_replace_all(cities, ".csv", ""))
  • 此块首先列出文件夹中的所有文件 yourfilepath 命名为 *.csv
  • 然后使用purrr::map 运行 files 变量的每个元素上的相同函数:read_csv, 跳过前 25 行。
  • 现在你有一个嵌套了 165 个数据框 dfs 列中的数据框。
  • unnest() 将这些扩展为完整 数据框,根据需要重复 files 行。
  • 然后你可以剥离 从files 中取出路径的额外部分以获取您的城市名称, 假设 .CSV 的文件名是城市的名称。
    • 如果 您已经在每个 .CSV 内的列中拥有城市名称, 那么你就不需要mutate(cities = ...) 行了。

现在可以轻松完成剩下的工作了:

df.cleaned <- df %>%
  rename(CO = `ug/m3`) %>%
  filter( !is.na(CO)) %>%
  mutate(rtime = paste(Date, Time),
         rtime = mdy_hm(rtime))

现在使用您的绘图代码,稍作更新:

ggplot(center, aes(rtime, CO)) + 
  geom_smooth(aes(color="Center"))+
  geom_smooth(data = df.cleaned, aes(color = cities))+
  labs(color="Legend")

更新更多正则表达式

df.cleaned <- df.cleaned %>%
  group_by(files) %>%
  mutate(cities = str_c(str_extract_all(cities, 
                                  "[A-Z][a-z]+", 
                                  simplify = T), 
                        collapse = " "))

【讨论】:

  • 感谢您的回答。我想问一个后续问题,如果引用的名称嵌入在 csv 文件的文件名中,例如 UGF2N_GDUM122_Chicago_03FEB16_R1 ,UGF2N_GDUM122_Chicago_03FEB16_R1
  • 然后你需要编写一些正则表达式来删除除名称之外的所有内容。在没有看到更多示例的情况下,我真的无法猜测什么可能会有所帮助,但我会在我的答案中发布一个可能的第一次尝试。
  • @Brain.对不起,我没有完成评论并按回车键。感谢您的回答。我想问一个后续问题,如果城市名称嵌入在 csv 文件的文件名中,例如 UGF2N_GDUM122_Chicago_03FEB16_R1WCK60_UBST122_Austin_13NOV16_R1and 等等,它们的名称都不同,但嵌入城市。有没有办法只提取城市名称。此外,它是 µg/m3 与 3 提高。有没有办法在 R 工作室上做 3 ?或者可以说替换第 3 列?
  • 关于你的第二个问题,你问的是用 µg/m^3 标记情节吗?或者您是否在询问如何修复从 CSV 进入 R 的名称?我在上面发布的代码已经将该列重命名为“CO”。
  • @Brain 我问的是后者。 µg/m^3 是我在 Rstudio 中查看时 CSV 文件中列的名称(3 被提出)我不知道如何复制凸起的部分。当我使用 µg/m3 时,发生了这个错误``µg/m3` contains unknown variables`
猜你喜欢
  • 2021-05-15
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多