R - расширение длины фрейма данных, чтобы быть похожим на другой - PullRequest
2 голосов
/ 23 февраля 2020

У меня очень необычное решение проблемы ниже. Интересно, есть ли лучший способ приблизиться к этому?

Проблема: 2 набора данных хранятся в двух разных фреймах данных. 1 из них представляет собой дневной баланс продукта a, а другой - еженедельный баланс продукта b. Из-за запроса мне нужно выполнить объединение двух фреймов данных для визуализации временных рядов. Поскольку продукт b не имеет ежедневных данных, баланс будет удерживаться в состоянии c до следующего обновления.

Как «развернуть» таблицу продукта b так, чтобы она имела ту же длину, что и таблица продукта, при этом сохраняя баланс stati c для дней, для которых продукт b не имеет данных?

Таблица продукта A

Имя фрейма данных: Таблица A

Date (yyyy-mm-dd) / Ccy/ Product /Balance
2019-12-01 / USD / A / 100
2019-12-01 / GBP / A / 100
2019-12-02 / USD / A / 200
2019-12-02 / GBP / A / 150
2019-12-03 / USD / A / 180
2019-12-03 / GBO / A / 210

Таблица продукта B

Имя фрейма данных: TableB

Date (yyyy-mm-dd) / Ccy/ Product /Balance
2019-12-01 / USD / B / 100
2019-12-01 / SGD / B / 100
2019-12-03 / USD / B / 180
2019-12-03 / SGD / B / 210

Мое причудливое решение ниже. Дайте мне знать ваши мысли и критику. СПАСИБО заранее !!

library(tidyverse)

unique_dates <- unique(tableA$date)
expanded_tableB <- unique_dates%>%left_join(tableB, by=c(Date=Date))%>% fill(-c(“date”))%>% fill(-c(“date”),.direction=c(“up”))

union_table <- bind_rows(tableA,expanded_tableB)

1 Ответ

0 голосов
/ 23 февраля 2020

Вот один из подходов. Если вам нужно добавить дополнительные строки для пропущенных дат как для Ccy из SGD, так и для USD для продукта "B", то сначала будет group_by Ccy. Используйте complete, чтобы заполнить даты, основываясь на первой и последней таблице, найденной в Таблице A (основываясь на том, что вы описали, я верю) Затем, наконец, bind_rows добавить таблицу A.

library(tidyverse)

tableB %>%
  group_by(Ccy) %>%
  complete(Date = seq.Date(min(tableA$Date), max(tableA$Date), by = "day")) %>%
  fill(Product, Balance) %>%
  bind_rows(tableA)

Выход

# A tibble: 12 x 4
# Groups:   Ccy [4]
   Ccy   Date       Product Balance
   <chr> <date>     <chr>     <dbl>
 1 SGD   2019-12-01 B           100
 2 SGD   2019-12-02 B           100
 3 SGD   2019-12-03 B           210
 4 USD   2019-12-01 B           100
 5 USD   2019-12-02 B           100
 6 USD   2019-12-03 B           180
 7 USD   2019-12-01 A           100
 8 GBP   2019-12-01 A           100
 9 USD   2019-12-02 A           200
10 GBP   2019-12-02 A           150
11 USD   2019-12-03 A           180
12 GBO   2019-12-03 A           210

Данные

tableA <- data.frame(
  Date = as.Date(c("2019-12-01", "2019-12-01", "2019-12-02", "2019-12-02", "2019-12-03", "2019-12-03")),
  Ccy = c("USD", "GBP", "USD", "GBP", "USD", "GBO"),
  Product = "A",
  Balance = c(100, 100, 200, 150, 180, 210),
  stringsAsFactors = F
)

tableB <- data.frame(
  Date = as.Date(c("2019-12-01", "2019-12-01", "2019-12-03", "2019-12-03")),
  Ccy = c("USD", "SGD", "USD", "SGD"),
  Product = "B",
  Balance = c(100, 100, 180, 210),
  stringsAsFactors = F
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...