2017-11-25 132 views
0

我有這樣[R如何根據切片一個data.table一個日期到一個列表

Date   Rain  Temp 
1990-01-01 0.0  29.2 
1990-03-03 0.0  30.4 
1990-06-10 NA  25.2 
1990-09-02 0.3  26.8 
1991-01-04 0.1  31.2 
1991-03-02 0.0  34.0 
1991-06-01 5.4  27.1 
1991-09-01 0.4  25.1 
1992-01-09 0.0  30.8 
1992-03-03 0.0  30.7 
1992-06-03 4.6  23.1 
1992-09-03 0.8  29.1 

但更大的一個data.table,大量的線,有時幾年都行不同的號碼。我需要每次在年份轉變切片它並將結果保存到列表:

[[1]] 
    Date   Rain  Temp 
    1990-01-01 0.0  29.2 
    1990-03-03 0.0  30.4 
    1990-06-10 NA  25.2 
    1990-09-02 0.3  26.8 
[[2]] 
    Date   Rain  Temp 
    1991-01-04 0.1  31.2 
    1991-03-02 0.0  34.0 
    1991-06-01 5.4  27.1 
    1991-09-01 0.4  25.1 
[[3]] 
    Date   Rain  Temp 
    1992-01-09 0.0  30.8 
    1992-03-03 0.0  30.7 
    1992-06-03 4.6  23.1 
    1992-09-03 0.8  29.1 

我在做什麼到現在爲止:

yearly.data <- list 
dates.intervals <- list(c("1990-01-01","1990-12-31"), 
         c("1991-01-02","1991-12-31"), 
         c("1992-01-02","1992-12-31")) 

for (y in dates.intervals){ 
    yearly.data <- c(yearly.data, list(data[Date %between% y])) 
} 

但是這樣一來,結果是

yearly.data 
[[1]] 
function (...) .Primitive("list") 

[[2]] 
     Date   Rain  Temp 
    1990-01-01 0.0  29.2 
    1990-03-03 0.0  30.4 
    1990-06-10 NA  25.2 
    1990-09-02 0.3  26.8 
... 
... 

我不能拿出從[[1]]該值,但這不是我的主要關注點。我主要關心的是,我認爲必須有一個更有效的方法來做到這一點,但我找不到它。

+3

'分裂(DAT,SUBSTR(DAT $日期,1,4))'。如果'Date'列類別的已'Date',你也可以做'分裂(DAT,lubridate ::年(DAT $日期))' –

+0

@Db'Date'是類'Date'所以我用了你最後的建議,這正是我正在尋找的!謝謝! – rvbarreto

+1

如果您使用的是data.table,則不需要在這裏使用lubridate。 Data.table爲其IDate類提供了一年功能(請參閱'?year')。 – Frank

回答

0

split()功能可用於在列表中分割一個數據幀劃分成多個數據幀,給定一個因子可變。例如:

rawData <- "Date   Rain  Temp 
1990-01-01 0.0  29.2 
1990-03-03 0.0  30.4 
1990-06-10 NA  25.2 
1990-09-02 0.3  26.8 
1991-01-04 0.1  31.2 
1991-03-02 0.0  34.0 
1991-06-01 5.4  27.1 
1991-09-01 0.4  25.1 
1992-01-09 0.0  30.8 
1992-03-03 0.0  30.7 
1992-06-03 4.6  23.1 
1992-09-03 0.8  29.1" 

data <- read.table(textConnection(rawData),header=TRUE,stringsAsFactors=FALSE) 
data$year <-as.factor(substr(data$Date,1,4)) 

yearList <- split(data,data$year) 

請注意,我選擇讀日期字段作爲字符串和子集的前4個字符,而不是讀它作爲一個日期,然後使用lubridate::year()提取一年。

問候,

萊恩

相關問題