2016-12-03 14 views
-1

我有一個包含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 <-seq(1,9861,1),以便我可以將它用作標題,但是當我嘗試dcast時,這些值都是NAs。 MM和DD並不重要。 – ichabod

+0

好吧,'RR'每行只有一個值,所以你的列只有一個非廣泛形式的'''每列值。因此,爲什麼這不是一個有用的轉變; 9681 * 4!= 27 * 9862. – alistaire

回答

-1

假設你有一個這樣的數據框,你可以運行一個循環

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列,包括 –