根据日期范围将数据框中的值除以另一个数据框中的值

时间:2018-08-08 10:35:29

标签: r date dataframe lubridate

我有两个数据框。数据框data包含两列:一列包含ymd日期,其他值:

        date value
1 2009-10-23  1100
2 2009-05-01  5000
3 2010-01-13  3050
4 2010-07-24  2700
5 2009-06-16  2600

我的第二个数据帧(名为factors)也有两列:另一个ymd日期和一个系数。在这里,对于每年的每个月,我始终都有两个特定的日期:每月的1号和15号。这就是数据框的外观(我在这个最小的示例中只添加了 some 日期,但不应有任何“跳跃”:我有10年的连续数据):

         date coeff
1  2009-05-01  2.00
2  2009-05-15  3.00
3  2009-06-01  2.50
4  2009-06-15  4.00
5  2009-10-01  3.65
6  2009-10-15  4.80
7  2010-01-01  2.40
8  2010-01-15  1.90
9  2010-07-01  5.20
10 2010-07-15  4.30

数据框已准备好在此提琴上使用:http://rextester.com/MOIY96065

我的问题

我需要在数据框1中创建一个新列(名为data,其中该列是data$value / factors$coeff,其条件如下:它必须使用coeff和前一个最接近的{{1 }}值。

例如:date除以date$value[1](10月15日的值),而factors$coeff[6]除以date$value[2](5月1日的值)

我的factors$coeff[1]数据帧按日期排序。我一直在使用factors来解析字符串类型的日期,但是我不知道该如何进行这项工作。

2 个答案:

答案 0 :(得分:2)

您可以使用findInterval()获取用于选择正确行的索引 来自factors

(i <- findInterval(date$date, factors$date))
#> [1]  6  1  7 10  4

date$value / factors$coeff[i]
#> [1]  229.1667 2500.0000 1270.8333  627.9070  650.0000

reprex package(v0.2.0.9000)创建于2018-08-09。

数据:

date <- structure(list(date = structure(c(14540, 14365, 14622, 14814, 
14411), class = "Date"), value = c(1100, 5000, 3050, 2700, 2600
)), row.names = c(NA, -5L), class = "data.frame")

factors <- structure(list(date = structure(c(14365, 14379, 14396, 14410, 
14518, 14532, 14610, 14624, 14791, 14805), class = "Date"), coeff = c(2, 
3, 2.5, 4, 3.65, 4.8, 2.4, 1.9, 5.2, 4.3)), row.names = c(NA, 
-10L), class = "data.frame")

答案 1 :(得分:1)

@Frank答案的here自适应格式

d <- function(x,y) {
      diff <- as.numeric(x-y)
      diff <- which.min(diff[diff>=0])
}

indx <- sapply(df$date, function(x) d(x,df1$date))

df_final <- cbind(df,df1[indx,,drop=FALSE])

df_final$result <- df_final$value/df_final$coeff

date value       date coeff    result
1 2009-10-23  1100 2009-10-15   4.8  229.1667
2 2009-05-01  5000 2009-05-01   2.0 2500.0000
3 2010-01-13  3050 2010-01-01   2.4 1270.8333
4 2010-07-24  2700 2010-07-15   4.3  627.9070
5 2009-06-16  2600 2009-06-15   4.0  650.0000 

数据

df<-read.table(text="        date value
           1 2009-10-23  1100
           2 2009-05-01  5000
           3 2010-01-13  3050
           4 2010-07-24  2700
           5 2009-06-16  2600
           ",header=TRUE)


df1<-read.table(text="         date coeff
           1  2009-05-01  2.00
           2  2009-05-15  3.00
           3  2009-06-01  2.50
           4  2009-06-15  4.00
           5  2009-10-01  3.65
           6  2009-10-15  4.80
           7  2010-01-01  2.40
           8  2010-01-15  1.90
           9  2010-07-01  5.20
           10 2010-07-15  4.30
           ",header=TRUE)