Как объединить переменную, которая меняется со временем [R] - PullRequest
1 голос
/ 06 августа 2020

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

Например, скажем, я хочу объединить цена яблок и апельсинов в списке яблок и апельсинов, приобретенных в определенные даты. Мой первый фрейм данных (транзакции) содержит дату совершения покупки и дату покупки: яблоко или апельсин. Второй фрейм данных содержит даты, когда цены на яблоки и апельсины изменились, и то, на что они изменились (в этом примере цены меняются 1 января, но на самом деле это может быть любая дата.


> transactions <- data.frame(Date_Purchased = as.Date(c("02/01/2018", "02/01/2020", "02/01/2019", "02/01/2020"), format = "%d/%m/%Y"), Item_Purchased = c("APPLE", "APPLE", "ORANGE", "ORANGE"))

> transactions
  Date_Purchased Item_Purchased
1     2018-01-02          APPLE
2     2020-01-02          APPLE
3     2019-01-02         ORANGE
4     2020-01-02         ORANGE


>price <- data.frame(Date=as.Date(c("01/01/2018", "01/01/2019", "01/01/2020", "01/01/2018", "01/01/2019", "01/01/2020"), format = "%d/%m/%Y"), Item = c("APPLE", "APPLE", "APPLE", "ORANGE", "ORANGE", "ORANGE"), Price = c(0.30, 0.35, 0.40, 0.60, 0.70, 0.75))

> price
        Date   Item Price
1 2018-01-01  APPLE  0.30
2 2019-01-01  APPLE  0.35
3 2020-01-01  APPLE  0.40
4 2018-01-01 ORANGE  0.60
5 2019-01-01 ORANGE  0.70
6 2020-01-01 ORANGE  0.75

Стоимость яблока 2 января 2018 года составляет 30 c, а 2 января 2020 года - 40 c. Аналогично, стоимость апельсина 2 января 2019 года составит 70 c, а 2 января 2020 года - 75 c. .

Таким образом, мне нужно, чтобы объединенный набор данных выглядел так:


  Date_Purchased Item_Purchased Price_On_Date_Purchased
1     2018-01-02          APPLE                    0.30
2     2020-01-02          APPLE                    0.40
3     2019-01-02         ORANGE                    0.70
4     2020-01-02         ORANGE                    0.75

К сожалению, я действительно ограничен на машине, на которой я использую, что у меня нет доступа к библиотеки CRAN и не могу загрузить дополнительные пакеты, а это значит, что я не смог использовать функцию neardate () в том, что я пробовал, что, на мой взгляд, было бы полезно.

Это уровень выше того, что я привык делать на R, так что, честно говоря, я немного растерялся.

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Это должно сработать. Я уверен, что его можно векторизовать, но я не очень хорошо разбираюсь в применении

transactions$Price <- 0

items <- unique(transactions$Item_Purchased)

for(item_i in seq_along(items)){
   date_idx <- findInterval(transactions$Date_Purchased[transactions$Item_Purchased==items[item_i]],
                            price$Date[price$Item==items[item_i]])
   transactions$Price[transactions$Item_Purchased==items[item_i]] <- price$Price[date_idx]
}
0 голосов
/ 06 августа 2020

Использование apply.

transform(d1, 
          Price_On_Date_Purchased=
            apply(d1, 1, function(x) 
              tail(d2[d2$Item == x["Item_Purchased"] & 
                        d2$Date <= x["Date_Purchased"], "Price"], 1)))
#   Date_Purchased Item_Purchased Price_On_Date_Purchased
# 1     2018-01-02          APPLE                    0.30
# 2     2020-01-02          APPLE                    0.40
# 3     2019-01-02         ORANGE                    0.70
# 4     2020-01-02         ORANGE                    0.75
0 голосов
/ 06 августа 2020

Поскольку вы не можете загружать дополнительные пакеты, здесь используется базовый подход R:

transactions$Price_On_Date_Purchased <- unlist(
     by(transactions, transactions$Item_Purchased, function(x) {
         tmp <- subset(price, Item == x$Item_Purchased)
         tmp$Price[findInterval(x$Date, tmp$Date)]
}))

transactions
#  Date_Purchased Item_Purchased Price_On_Date_Purchased
#1     2018-01-02          APPLE                    0.30
#2     2020-01-02          APPLE                    0.40
#3     2019-01-02         ORANGE                    0.70
#4     2020-01-02         ORANGE                    0.75

Мы делим transactions на основе Item_Purchased, subset соответствующих элементов из price фрейма данных. Используя findInterval, мы находим соответствующую дату, в которую была изменена цена, и получаем соответствующее значение Price.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...