Как переписать несколько строк тиббла другим тибблом - PullRequest
0 голосов
/ 15 сентября 2018

Предположим, у меня есть данные, подобные следующим:

# A tibble: 10 x 4
# Groups:   a.month, a.group [10]
   a.month     a.group  other.group  amount
   <date>      <chr>    <chr>        <dbl>
 1 2016-02-01  A        X            15320 
 2 2016-05-01  A        Z            50079 
 3 2016-06-01  A        Y            60564 
 4 2016-08-01  A        X            10540 
 5 2017-01-01  B        X            30020 
 6 2017-03-01  B        X            76310 
 7 2017-04-01  B        Y            44215
 8 2017-05-01  A        Y            67241 
 9 2017-06-01  A        Z            17180 
10 2017-07-01  B        Z            31720

И я хочу создать строки для каждой возможной комбинации a.group, other.group и для каждого промежуточного месяца (с amount, равным нулю, если его нет в данных выше)

Мне удалось произвести тиббл с суммами по умолчанию через:

another.tibble <- as_tibble(expand.grid(
  a.month = months.list,
  a.group = unique.a.groups,
  other.group = unique.o.groups,
  amount = 0
));

Как мне приступить к заполнению another.tibble значениями из первого?

1 Ответ

0 голосов
/ 15 сентября 2018

Важно вызвать expand.grid с stringsAsFactors=FALSE. Затем мы просто делаем LEFT_JOIN(), чтобы завершить комбинации, в которых у нас есть данные

library(tidyverse)

df <- tribble(
    ~a.month,      ~a.group,   ~other.group,   ~amount,
    '2016-02-01',  'A',        'X',            15320, 
    '2016-05-01',  'A',        'Z',            50079, 
    '2016-06-01',  'A',        'Y',            60564, 
    '2016-08-01',  'A',        'X',            10540, 
    '2017-01-01',  'B',        'X',            30020, 
    '2017-03-01',  'B',        'X',            76310, 
    '2017-04-01',  'B',        'Y',            44215,
    '2017-05-01',  'A',        'Y',            67241, 
    '2017-06-01',  'A',        'Z',            17180, 
    '2017-07-01',  'B',        'Z',            31720
)

another.tibble <- as_tibble(expand.grid(
    a.month = unique(df$a.month),
    a.group = unique(df$a.group),
    other.group = unique(df$other.group),
    amount = 0, stringsAsFactors=F)
)

another.tibble %>%
    left_join(df, by= c("a.month" = "a.month", "a.group" = "a.group", "other.group" = "other.group")) %>%
    mutate(amount.x = ifelse(is.na(amount.y), 0, amount.y)) %>%
    rename(amount = amount.x) %>%
    select(1:4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...