在R中添加日期到日期

时间:2014-10-20 06:50:53

标签: r

我的数据如下:

   date rmean
1/2/2004    6
1/5/2004    30
1/6/2004    27
1/7/2004    20
1/8/2004    10
1/9/2004    22
1/12/2004   21
1/13/2004   18
1/14/2004   19
1/15/2004   7
1/16/2004   9
1/19/2004   11
1/20/2004   18
1/21/2004   26
1/26/2004   8
1/27/2004   16
1/28/2004   19
1/29/2004   4
1/30/2004   1
2/3/2004    11
2/4/2004    9
2/5/2004    26
2/6/2004    16
2/9/2004    25
2/10/2004   2
2/11/2004   6
2/12/2004   2
2/13/2004   25
2/16/2004   17
2/17/2004   21
2/18/2004   26
2/19/2004   6
2/20/2004   14
2/23/2004   4
2/24/2004   7
2/25/2004   19
2/26/2004   10
2/27/2004   23

我想找到(每月20天+ 15日)的rmean。

注意:如果我的数据中没有该日期的rmean值(某些天被跳过),我希望它找到最近一天的rmean

这样的事情,但是(每月20 + 15)而不是15:

dt <- Dataframe[, list(day15=abs(mday(date)-15) == min(abs(mday(date)-15)), 
                       date, rmean), by=list(year(date), month(date))]
dt[day15==TRUE]
Finale = dt[day15==TRUE , .SD[1,] ,by=list(month, year)]

上面示例的预期输出:

date        rmean
 2/4/2004    9

1 个答案:

答案 0 :(得分:1)

以下是base R。

的一种方法

首先,一些虚拟数据:

d <- data.frame(date=as.Date('1/1/2004', '%d/%m/%Y') + sort(sample(364, 200)),
                x=runif(200))

head(d)

#         date          x
# 1 2004-01-02 0.29818227
# 2 2004-01-03 0.12543617
# 3 2004-01-04 0.78145310
# 4 2004-01-05 0.30456904
# 5 2004-01-06 0.45228066
# 6 2004-01-07 0.07511554

计算数据日期范围内的到达日期:

arrival <- 
  seq(as.Date(sprintf('15/%s', format(min(d$date), '%m/%Y')), '%d/%m/%Y'), 
      as.Date(sprintf('15/%s', format(max(d$date), '%m/%Y')), '%d/%m/%Y'),
      by='month') + 20

arrival

#  [1] "2004-02-04" "2004-03-06" "2004-04-04" "2004-05-05" "2004-06-04" "2004-07-05"
#  [7] "2004-08-04" "2004-09-04" "2004-10-05" "2004-11-04" "2004-12-05" "2005-01-04"

找到每个到达日期的最近日期(如果有两个最接近的日期,则取最大x值),并返回data.frame,其中包含&#34;到达&#34;日期,每个到达日期的最近日期,以及x的相应值。

cbind(arrival, do.call(rbind, lapply(arrival, function(x) {
  closest <- which(abs(d$date - x) == min(abs(d$date - x)))
  d[closest[which.max(d$x[closest])], ]
})))

#        arrival       date          x
# 25  2004-02-04 2004-02-03 0.78836413
# 45  2004-03-06 2004-03-06 0.61214949
# 63  2004-04-04 2004-04-04 0.49171847
# 79  2004-05-05 2004-05-05 0.02989788
# 93  2004-06-04 2004-06-04 0.25923715
# 109 2004-07-05 2004-07-05 0.90330331
# 120 2004-08-04 2004-08-04 0.48133237
# 139 2004-09-04 2004-09-03 0.12280267
# 151 2004-10-05 2004-10-03 0.46888891
# 169 2004-11-04 2004-11-04 0.40397949
# 186 2004-12-05 2004-12-04 0.18685615
# 200 2005-01-04 2004-12-30 0.97462347