R:如果日期重合,则将一列中的值乘以另一列中的值

R: Multiply values in one column to those in another if the dates coincide

我已经尝试了好几天了,但我似乎找不到办法。 我有两个数据框。 一个名为 "df1",有两个变量:日期、价格

         date        price
        2019-12-21    140
        2019-10-25     91
        2019-10-24     91    
        2019-12-13     70

另一个,名为"df2",有两个变量:日期、汇率

         date        exchange rate
        2019-12-21    1.1097
        2019-12-22    1.117
        2019-12-23    1.1075  
           ...         ...
        2019-12-13    1.108
           ...         ...
        2019-10-25    1.1074
        2019-10-24    1.1073


我想在日期重合时将 df2 中的汇率乘以 df1 中的价格。并将其添加到 df1 的列中。所以结果会是这样的:

         date        price    priceEUR
1       2019-12-21    140      155.358
2       2019-10-25     91      100.7734
3       2019-10-24     91      100.7643
4       2019-12-13     70      77.56

非常感谢。

一种方法是:

library(tidyverse)

df3 <- inner_join(df1, df2)

df3 <- df3 %>%
    mutate(priceEUR = price * rate)

我们也可以使用base R来做到这一点。

使用match

df1$priceEUR <- df1$price * df2$exchange_rate[match(df1$date, df2$date)]
df1
#        date price priceEUR
#1 2019-12-21   140 155.3580
#2 2019-10-25    91 100.7734
#3 2019-10-24    91 100.7643
#4 2019-12-13    70  77.5600

或使用 mergetransform

transform(merge(df1, df2, by = "date"), priceEUR = price * exchange_rate)

数据

df1 <- structure(list(date = structure(c(4L, 2L, 1L, 3L), .Label = c("2019-10-24", 
"2019-10-25", "2019-12-13", "2019-12-21"), class = "factor"), 
price = c(140L, 91L, 91L, 70L)), row.names = c(NA, -4L), class = "data.frame")

df2 <- structure(list(date = structure(c(4L, 5L, 6L, 3L, 2L, 1L), 
.Label = c("2019-10-24", "2019-10-25", "2019-12-13", "2019-12-21", "2019-12-22", 
"2019-12-23"), class = "factor"), exchange_rate = c(1.1097, 1.117, 1.1075, 1.108, 
1.1074, 1.1073)), class = "data.frame", row.names = c(NA, -6L))