2016-11-17 49 views
0

我有一個巨大的數據集,我必須按時間範圍進行子集化並將子集寫入新的數據框。我的問題是在第二天12PM和12PM之間對數據集進行子集化。R通過幾天的時間範圍的子集行

白天小型虛擬子集。

dfrm <- data.frame(a=rnorm(240),dtm=as.POSIXct("2007-03-27 05:00", tz="GMT")+3600*(1:240)) 
dfrm 

## Create list of dates in dfrm 
date.start<-format(min(dfrm$dtm),"%Y-%m-%d") 
date.end<-format(max(dfrm$dtm),"%Y-%m-%d") 
datum<-seq(as.Date(date.start),as.Date(date.end),by="days") 

## Get Date and Time from dfrm 
dfrm$day<-as.POSIXlt(as.character(dfrm$dtm),format="%Y-%m-%d") 
dfrm$clock<-as.POSIXlt(as.character(dfrm$dtm)) 
dfrm$clock<-format(dfrm$clock,format="%H:%M:%S") 


## write dfrm daywise 
j<-1 

while (j<=length(datum)) 
{ 
    name <- paste("day", datum[j], sep = "") 
    assign(name,dfrm[which(dfrm$day==format(datum[j],"%Y-%m-%d")),]) 
    j<-j+1 
} 

謝謝你的幫助。

+0

你想'DFRM < - data.frame(A = RNORM(240),DTM = as.POSIXct(「2007-03-27 05:00」)+ 3600 *(1:240)); split(dfrm,cut(dfrm $ dtm,breaks = seq(as.POSIXct(paste0(as.Date(min (dfrm $ dtm)) - 1,「12:00:00」)),as.POSIXct(paste0(as.Date(max(dfrm $ dtm))+ 1,「12:00:00」)),by =「1 day」)))'? – lukeA

+0

感謝您的回覆。我需要在循環內部執行解決方案,因爲我必須在循環內部執行更多步驟。 – Firefly

+0

編輯第一條評論的速度很慢......感謝您的回覆。我需要在循環內部執行解決方案,因爲我必須在循環內部執行更多步驟。我用你的例子的序列部分作爲「datum」,所以我可以將它們用作斷點。任何方式來執行循環內的子集?因此,要選擇數據[j]和數據[j + 1]之間的所有文件並將它們寫入新的數據幀? – Firefly

回答

0

你可以做

dfrm <- data.frame(a=rnorm(240),dtm=as.POSIXct("2007-03-27 05:00")+3600*(1:240)); 
lst <- split(dfrm, cut(dfrm$dtm, breaks = seq(as.POSIXct(paste0(as.Date(min(dfrm$dtm))-1, " 12:00:00")), as.POSIXct(paste0(as.Date(max(dfrm$dtm))+1, " 12:00:00")), by = "1 day"))) 

現在,花如幾天的一個子集:

lst2 <- lst[as.character(seq(as.POSIXct("2007-04-04 12:00:00"), as.POSIXct("2007-04-06 12:00:00"), "1 day"))] 

而且每一天創建一個單獨的數據幀:

list2env(lst2, envir = .GlobalEnv) 
head(`2007-04-04 12:00:00`) 
+0

謝謝,幫助。 – Firefly