2016-08-12 54 views
1

我有一個包含以下列的CSV格式的文本文件(76行)。日期包含年份範圍(本例中爲2003 - 2012),ID包含每行的年份。Programmaticallty將R中的文本文件拆分爲明智的片段

Date     ID    values 
2003-06-07 00:00:00  1697144#6_2003 240 
2004-01-01 00:00:00  1697144#6_2004 240 
2005-05-27 00:00:00  1697149#6_2005 240 
2006-01-01 00:00:00  1697149#6_2006 240 
2007-01-01 00:00:00  1697149#6_2007 240 
2008-01-01 00:00:00  1697149#6_2008 240 
2009-01-01 00:00:00  1697149#6_2009 240 
2010-01-01 00:00:00  1697149#6_2010 240 
2011-01-01 00:00:00  1697149#6_2011 240 
2012-01-01 00:00:00  1697149#6_2012 240 
2003-06-07 00:00:00  1697158#6_2003 240 
2004-01-01 00:00:00  1697158#6_2004 240 
2003-06-07 00:00:00  1697163#6_2003 240 

使用R,我想打破這個文本文件到每年的多個文件,使每個文件(例如:my_file_2003.csv)中包含的特定年份的獨特記錄(日期,編號和值)只要。這個question(堆棧溢出)演示瞭如何將R數據幀分成多個文件。此link演示分裂大型CSV文件,但在我的情況下,我需要將特定年份的所有記錄合併到一個文件。作爲R的新手,有人能幫助我如何將這個單一的文本文件分解成每年的多個文件?我在Windows 7(x64)上使用R版本3.2.3。

回答

1

您只需讀取csv,然後對您的數據框進行子集化,以便只寫入具有匹配年限的行。這應該可以工作,但我在R上有點生疏,所以我可能在某個地方犯了一個愚蠢的語法錯誤。

df <- read.csv("path.csv") 
uniqueYears <- unique(as.numeric(format(strptime(df$date, format="%Y-%m-%d %H:%M:%S"), format="%Y"))) 
for(i in uniqueYears){ 
    yeardf <- df[as.numeric(format(strptime(df$date, format="%Y-%m-%d %H:%M:%S"), format="%Y")) == i,] 
    write.csv(yeardf, paste("path", i, ".csv", sep="")) 
} 

根據您的評論進行編輯。可能不是最有效的解決方案,但應該可以正常工作。

+0

不,你沒有犯一個語法錯誤,因爲它爲我工作。然而,你從2003年到2012年限制了這個循環,但情況可能並非如此。我如何使這個循環變得靈活,以便它搜索年份的最小值和最大值(在輸入文件列中),然後自動生成輸出文件? –

+0

編輯爲取消限制循環。 –

+1

順便說一句,如果數據按年排序,並且每年之間都有數據,只需從第一個值和最後一個值中擷取年份並循環遍歷'firstYear:lastYear',則可以更高效地完成這項工作,但如果這樣做更健壯它是無序的或缺失的年份。 –

1

隨着dplyrlubridate

玩具數據:

dat <- data.frame(date = seq.Date(from = as.Date("2010-01-01"), 
            to = as.Date("2013-01-01"), length.out = 10), 
        data = letters[1:10]) 
dat 

     date data 
1 2010-01-01 a 
2 2010-05-02 b 
3 2010-09-01 c 
4 2011-01-01 d 
5 2011-05-03 e 
6 2011-09-01 f 
7 2012-01-01 g 
8 2012-05-02 h 
9 2012-09-01 i 
10 2013-01-01 j 

要寫入該.csv文件(每個被命名爲YEAR.csv並保存到工作目錄):

library(dplyr) 
library(lubridate) 
dat %>% 
group_by(year = year(date)) %>% 
do(df = data.frame(.)) %>% 
do(csvs = write.csv(x = .$df, file = paste0(.$year, ".csv"))) 
+0

我跑你的腳本,但它給錯誤「找不到函數%>%」。我在Windows 7(x64)上使用R版本3.2.3。 –

+0

您可能有舊版本的'dplyr'。它應該工作,如果你更新它。 –