Programmaticallty将R中的文本文件拆分为年份切片

时间:2016-08-12 16:55:08

标签: r csv

我有一个CSV格式的文本文件(76行),包含以下列。日期包含年份范围(在本例中为2003 - 2012年),ID包含每行的年份。

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)仅包含该特定年份的唯一记录(日期,ID和值)。此question(堆栈溢出)演示了如何将R数据帧拆分为多个文件。此link演示了拆分大型CSV文件,但在我的情况下,我需要将特定年份的所有记录合并到一个文件中。作为R的新手,有人可以帮助我如何将这个单个文本文件分解为每年的多个文件?我在Windows 7(x64)上使用R版本3.2.3。

2 个答案:

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

根据您的评论进行编辑。可能不是最有效的解决方案,但它应该可以正常工作。

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