2017-08-04 108 views
0

我试图用一个时间序列图比较不同的城市与一个center数据(数据帧)。其中center是一个R studio中的数据框对象,我已经导入。R:在一个时间序列图中独立绘制多个csv文件

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

我希望它看起来是这样的:(与x轴是时间,并与所有为纯色y轴是CO

enter image description here

有我想要的四件事做每个csv文件,但最终,有它的自动化,这四个动作完成到每个165个CSV文件。

1)跳过前25行的CSV文件

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

3)拆下​​,其中在第3栏的单元中的值是空的行

4)更改从微克/立方米3列的名称为CO

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

我在一个csv文件上使用了下面的代码来查看它是否可以在一个csv上工作。我不知道如何一切都在一个有效的manner.achieve这种结合:

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") 

UPDATE: 每个城市的CSV文件似乎已经结合起来,创造一个line.I如果我能我不知道发布确切的输出,但它看起来像下面这个:粉红色的线是城市,蓝色是center.x轴时间和y轴是CO.I希望这有助于。

结果的

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

+2

要自动化阅读165 csv文件的部分,可以获取所有csv文件名称的字符矢量,然后在文件名上添加文字。例如'file_names <--list.files(path =“your folder path”,pattern =“.csv”)'获取文件名,然后'lapply(file_names,FUN = function(file){...}) ' – shaojl7

+0

随着我发布的正则表达式,所有这些将解析为“”,因为你的城市名称是大写的,而不是像你给的例子一样的标题情况。如果您不尝试提取城市名称,而是像这样留下那一列“城市”,那么您的情节应该为每个城市分别设置不同的行,如'aes(color = cities)'所给出的。这部分工作是否正确? – Brian

+0

@Brian我决定不尝试正则表达式,当我意识到我给出的例子是不同的。没有添加正则表达式,它仍然给了我一行。 – Mah

回答

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", "")) 
  • 这一块首先对命名* .CSV文件夹 yourfilepath中的所有文件的列表。
  • 然后使用purrr::mapfiles变量的每个元素上运行 相同的功能:read_csv, 跳过第一25行。
  • 现在,您在dfs列中有一个165嵌套的 数据帧的数据帧。
  • unnest()将这些扩展为完整的 数据帧,根据需要重复files行。
  • 然后,您可以从files中删除 的额外部分,以获取您的城市名称, 假定.CSV的文件名是城市的名称。
    • 如果您 已经在每个.csv里面列有该城市的名称, 那么你不需要mutate(cities = ...)线。

现在是易peasy做休息:

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 = " ")) 
+0

谢谢你的回答。我想问一个后续问题,如果cites的名字被嵌入在csv文件的文件名中,比如'UGF2N_GDUM122_Chicago_03FEB16_R1','UGF2N_GDUM122_Chicago_03FEB16_R1' – Mah

+0

然后你需要写一些正则表达式除去名字以外的所有东西。没有看到更多的例子,我无法猜测可能有什么帮助,但我会在我的答案中发布一个可能的第一次尝试。 – Brian

+0

@ Brain.Sorry,我没有完成评论,然后按回车。谢谢你的回答。我想问一个后续问题,如果城市的名字被嵌入在csv文件的文件名中,比如'UGF2N_GDUM122_Chicago_03FEB16_R1','WCK60_UBST122_Austin_13NOV16_R1'等等都有不同的名字,但是城市嵌入其中。是否有办法只提取城市名称。另外,3升高时为μg/ m3。有没有办法在R studio上做到这一点?或者可以说替换第3列? – Mah

相关问题