我有一个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。
答案 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)
dplyr
和lubridate
:
玩具数据:
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")))