Как я могу конвертировать доходы по разным обменным курсам, используя другой фрейм данных? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть два фрейма данных в R:

Dates<-as.Date(c("01/01/14","01/02/14","01/03/14","01/04/14","01/05/14","01/06/14","01/07/14","01/08/14","01/09/14","01/10/14","01/11/14","01/12/14"), "%d/%m/%y")
SGD<-c(0.710123, 0.706803,0.694468, 0.703793, 0.709672, 0.715876,0.721752,0.728214,0.740987,0.747695,0.744376,0.741504)
EUR<-c(1.230716,1.221853,1.217159,1.219232,1.220381,1.218245,1.215026,1.211793,1.207671,1.20807,1.202782,1.202307)
ExchangeRate <- data.frame(Dates,SGD,EUR)

и

Order_Date<-as.Date(c("01/01/14","11/01/14","02/02/14","10/03/14","01/05/14","01/06/14","22/07/14","01/08/14","18/09/14","01/10/14","23/11/14","01/12/14"), "%d/%m/%y")
Currency <-c("SGD","SGD","EUR","EUR","EUR","EUR","SGD","SGD","SGD","SGD","EUR","EUR")
Revenue<-c(10,20,30,40,50,60,70,80,90,100,110,120)
Customer<-data.frame(Order_Date,Currency,Revenue)

Я хочу создать еще один столбец рядом с доходами с доходом в евро, соответствующим правильная дата с учетом только месяца и года (поскольку обменный курс установлен на ежемесячной основе).

Пример: в первой строке таблицы «Клиент» следует посмотреть в таблице ExchangeRate, какому обменному курсу соответствует соответствующий на январь 2014 г. для SGD и вернуть новый столбец с общим доходом в евро -> 10 * 0,71 = 7,1 и сделать то же самое для каждой строки.

1 Ответ

1 голос
/ 15 июля 2020

Мы можем сделать это за несколько шагов, присоединив Customers к ExchangeRate фрейму данных:

  1. Используйте lubridate::floor_date, чтобы получить первый день месяца в списке клиентов, чтобы мы могли совпадают с датами в таблице ExchangeRate. См. Этот вопрос для обсуждения того, как это сделать: Первый день месяца из даты POSIXct, время с использованием lubridate
  2. Затем используйте dplyr::left_join, чтобы добавить соответствующий обменный курс в список клиентов стол. Вот более широкое обсуждение объединения фреймов данных: Как объединить (объединить) фреймы данных (внутренний, внешний, левый, правый)
  3. Затем мы можем умножить Revenue на SGD курс обмена при Currency == 'SGD'. Вот вопрос о создании новой переменной на основе условия: Как добавить столбец в фрейм данных на основе условия?
  4. Наконец, мы, вероятно, захотим использовать dplyr::select для удаления ненужные переменные (не показаны)

См. ниже:

library(tidyverse)
library(lubridate)

Customer %>%
    mutate(md = floor_date(Order_Date, 'month')) %>%
    left_join(ExchangeRate, by = c('md' = 'Dates')) %>%
    mutate(Revenue = if_else(Currency == 'SGD', SGD * Revenue, Revenue))

  
   Order_Date Currency   Revenue         md      SGD      EUR
1  2014-01-01      SGD   7.10123 2014-01-01 0.710123 1.230716
2  2014-01-11      SGD  14.20246 2014-01-01 0.710123 1.230716
3  2014-02-02      EUR  30.00000 2014-02-01 0.706803 1.221853
4  2014-03-10      EUR  40.00000 2014-03-01 0.694468 1.217159
5  2014-05-01      EUR  50.00000 2014-05-01 0.709672 1.220381
6  2014-06-01      EUR  60.00000 2014-06-01 0.715876 1.218245
7  2014-07-22      SGD  50.52264 2014-07-01 0.721752 1.215026
8  2014-08-01      SGD  58.25712 2014-08-01 0.728214 1.211793
9  2014-09-18      SGD  66.68883 2014-09-01 0.740987 1.207671
10 2014-10-01      SGD  74.76950 2014-10-01 0.747695 1.208070
11 2014-11-23      EUR 110.00000 2014-11-01 0.744376 1.202782
12 2014-12-01      EUR 120.00000 2014-12-01 0.741504 1.202307
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...