根据列中的值拆分csv,然后按行合并/绑定输出

根据列中的值拆分csv,然后按行合并/绑定输出

问题描述:

我有一个包含4列(YY,MM,DD,RR)的csv文件。这里的样本数据:根据列中的值拆分csv,然后按行合并/绑定输出

Link to data

目前的格式有9861行和4个colums像这样(每日从数据19​​81-2007):

YY,MM,DD,RR 
1981,1,1,0 
1981,1,2,0 
1981,1,3,-9999 
1981,1,4,-9999 
1981,1,5,0 
1981,1,6,0 
..... 
..... 
2007,1,31,-9999 

我想分裂每年csv文件。输出应该是具有相同列数的27个csv文件。 例如,1981.csv包含:

YY, MM, DD, RR 
1981, 1, 1, 0.4 
1981, 1, 2, 0 
..... 
..... 
1981, 12, 31, 0.5 

这里是我的脚本:

dat <- read.csv("test_dat.csv", header = T, sep = ",") 
spt1<-split(dat,dat$YY) 
lapply(names(spt1), function(x){write.csv(spt1[[x]], file = paste0("output",x, sep = "",".csv"),row.names=F)}) 

我想按行输出的CSV文件绑定,使得输出将是这样的:

YY,1,2,3,4,5,6,7,8,9,10,......,365 
1981,val1,val2,.............,val365 
... 
... 
2008,val1,val2,.............,val365 

闰年应该有366天。

在R中有这么容易吗?

我会很感激任何帮助。

+0

鉴于您在三列有个约会和一些类型的测量,蔓延到宽形式真的不明智的。此外,目前还不清楚你如何重塑形状,因为你没有一个ID变量来变成标题。 – alistaire

+0

@alistaire。我试图创建一个像这样的虚拟列:dat $ test ichabod

+0

好吧,'RR'每行只有一个值,所以你的列只有一个非广泛形式的'''每列值。因此,为什么这不是一个有用的转变; 9681 * 4!= 27 * 9862. – alistaire

假设你有一个这样的数据框,你可以运行一个循环

YY <- seq(1981, 2007,1)  #Defining years 
RR <- runif(27,0,30)  #Defining another random column, replace this with your respective columns 

df <- data.frame(YY,RR)  #created data frame 
df$YY <- as.factor(df$YY) #ignore this step if your year column is already a factor 

for (i in levels(df$YY)) {  #run a for loop for each year 
    year <- i 
    df.subset <- df[df$YY %in% year,]  #subset your data as per year 
    write.csv(df.subset,file = paste(year,"csv",sep = ".")) #save the subset df in a new file with year as file name 
} 
+1

@ Hardik.Many谢谢你的回复。我认为你的解决方案比我的更优雅。分割文件后,有没有办法按行连接它们?我在上面编辑了我的问题。是否可以在脚本的循环中添加“绑定”命令? – ichabod

+0

最初我只是计划转换csv文件,但基于@alistaire的评论,这种转换并不好。所以我决定首先将它们分开,然后再次绑定为解决方案。我希望你能帮助我。 – ichabod

+0

嗨,你是如何获得val1,val2值的?你最初的df只有4列,包括 –