2017-11-25 134 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()提取一年。

问候,

莱恩

相关问题