根据另一个数据框中的日期范围划分数据框中的值
Divide values in data frame according to date range in another data frame
我有两个数据框。 Dataframe 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 号。这是数据框的样子(我只在这个最小的例子中添加了 一些 日期,但不应该有任何 'jumps':我在 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
数据帧已准备好在此 fiddle 上使用:http://rextester.com/MOIY96065
我的问题
我需要在数据框 1 中创建一个新列(名为 data
),其中此列 data$value / factors$coeff
遵循以下条件:它必须使用 coeff
和前一个最接近的 date
值。
例如:date$value[1]
除以factors$coeff[6]
(10月15日的值),但date$value[2]
除以factors$coeff[1]
(5月的值) 1).
我的 factors
数据框按日期排序。我一直在使用 lubridate
从字符串类型中解析日期,但我不知道如何才能让它工作。
改编自@Frank 的回答
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)
您可以使用 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")
我有两个数据框。 Dataframe 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 号。这是数据框的样子(我只在这个最小的例子中添加了 一些 日期,但不应该有任何 'jumps':我在 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
数据帧已准备好在此 fiddle 上使用:http://rextester.com/MOIY96065
我的问题
我需要在数据框 1 中创建一个新列(名为 data
),其中此列 data$value / factors$coeff
遵循以下条件:它必须使用 coeff
和前一个最接近的 date
值。
例如:date$value[1]
除以factors$coeff[6]
(10月15日的值),但date$value[2]
除以factors$coeff[1]
(5月的值) 1).
我的 factors
数据框按日期排序。我一直在使用 lubridate
从字符串类型中解析日期,但我不知道如何才能让它工作。
改编自@Frank 的回答
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)
您可以使用 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")