сопоставить несколько столбцов со значением строки из другого кадра на основе даты - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующие таблицы:

test<- read.table(text = "        var1 var2 var3 var4
                  1 12/12/2017  CAD   10    3
                  2 20/02/2018  CAD   30    8
                  3 14/03/2016  USD   44    9
                  4 10/05/2000  KOR   56   11
                  5 04/04/2016  GBP   45   22")

test2 <- read.table(text = "        date USD CAD KOR GBP
1 12/12/2017   1   2 0.1   2
2 20/02/2018   2   1 0.8   1
3 14/03/2016   3   4 1.0   4
4 10/05/2000   4   5 0.6   5
5 04/04/2016   5   1 1.0   1")

Я хочу умножить значения test$var3 и test$var4 на соответствующие значения в таблице test2 в зависимости от даты.Так, например, если test$var2 - это CAD, а test$var1 - 12/12/2017, следует обратиться к таблице test2, чтобы найти спотовый курс CAD на эту дату и умножить его на test$var3 и test$var4.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если вы хотите, чтобы значение валюты было доступно в вашем data.frame, не глядя, вы можете объединить таблицы после преобразования test2 в длинный формат.

Если вы просто хотите посмотреть, ответ Ронака Шаха работает очень хорошо.

library(dplyr)
library(tidyr)

test %>% 
  inner_join((test2 %>% gather(key = "currency", value = "curency_value", -date)), by = c("var1" = "date", "var2" = "currency") ) %>% 
  mutate(var3 = var3 * curency_value,
         var4 = var4 * curency_value)

        var1 var2  var3 var4 curency_value
1 12/12/2017  CAD  20.0  6.0           2.0
2 20/02/2018  CAD  30.0  8.0           1.0
3 14/03/2016  USD 132.0 27.0           3.0
4 10/05/2000  KOR  33.6  6.6           0.6
5 04/04/2016  GBP  45.0 22.0           1.0
0 голосов
/ 24 мая 2018

Мы можем использовать mapply для var1 и var2 из test, чтобы отфильтровать строку и столбец соответственно test2, чтобы получить спот-курс для этой конкретной валюты в определенный день.Как только мы получим spot_rate, мы можем умножить его на var3 и var4.

spot_rate  = mapply(function(x, y) test2[x == test2$date, y == names(test2)],
                                      test$var1, test$var2)
spot_rate
#[1] 2.0 1.0 3.0 0.6 1.0

test$var3 * spot_rate
#[1]  20.0  30.0 132.0  33.6  45.0

test$var4 * spot_rate
#[1]  6.0  8.0 27.0  6.6 22.0

Мы также можем получить spot_rate, используя match, что более или менее одинаковооперация.

mapply(function(i, j) test2[i, j], match(test$var1, test2$date), 
                                   match(test$var2, names(test2)))

#[1] 2.0 1.0 3.0 0.6 1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...