2017-08-04 39 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