R:在一个时间序列图中独立绘制多个csv文件(还导入带条件的csv文件)

时间:2017-08-04 01:40:32

标签: r csv ggplot2 import time-series

我试图最终得到一个时间序列图,比较不同城市的center数据(数据框)。其中center是R studio中的数据框对象,我已导入。

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

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

enter image description here

我想对每个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文件似乎已合并创建一行。我不确定是否可以发布确切的输出,但它看起来像下面的那个:粉色线是城市,蓝色是中心.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"

enter image description here

1 个答案:

答案 0 :(得分: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 = " "))