Condensa e unisci frame di dati

Oct 12 2020

Ho un frame di dati che sto cercando di unire con un altro e sto riscontrando alcuni problemi che credo riconducano al fatto che ogni osservazione è un incidente piuttosto che un importo cumulativo. Ho il frame di dati sotto in cui ogni riga è un'osservazione individuale, quindi userò weeke codeper unirlo con un altro frame di dati basato sulle stesse variabili weeke code.

Il data frame aha ogni riga come un'osservazione specifica, ma ho bisogno che diventi un'osservazione / riga cumulativa per codice / data. Sono completamente perplesso.

  date       count       code  week
  <date>     <dbl>      <dbl> <dbl>
1 2020-06-07     4      13309    23
2 2020-06-07     5      13309    23
3 2020-07-12     6      18099    28
4 2020-07-12     8      18099    28

deve diventare

  date       count       code  week
  <date>     <dbl>      <dbl> <dbl>
1 2020-06-07     9      13309    23
2 2020-07-12    14      18099    28

Quindi, sarà in grado di essere unito al frame di dati b

  date       color     name       code  week
  <date>     <char>   <char>      <dbl> <dbl>
1 2020-06-07 Blue         A      13309    23
1 2020-06-07 Yellow       B      13309    23
1 2020-06-07 Purple       D      13309    23
3 2020-07-12 Yellow       A      18099    28
3 2020-07-12 Blue         E      18099    28

e il risultato finale sarà

  date       color     name     code   week    count
  <date>     <char>   <char>   <dbl>  <dbl>    <dbl>
1 2020-06-07 Blue         A    13309     23        9
1 2020-06-07 Yellow       B    13309     23        9
1 2020-06-07 Purple       D    13309     23        9
3 2020-07-12 Yellow       A    18099     28       14
3 2020-07-12 Blue         E    18099     28       14

Inizialmente ho usato il codice seguente per farlo, ma ha completamente fatto saltare in aria il mio frame di dati. Le mie dimensioni sono passate da dim(a) == (209807, 86)a dim(merged) == (1367029, 89). Ho provato più tipi di join (destro, sinistro, interno, ecc.) Ma tutti hanno comunque fatto saltare in aria il frame di dati (variato di alcune 100 osservazioni circa, ma ha comunque prodotto oltre un milione di righe). Ecco perché penso che il problema sia dovuto al afatto che ogni osservazione è un'osservazione di riepilogo per un codice specifico in una data specifica.

merged <- right_join(x = b,
                     y = a, 
                     by = c("code" = "code",
                       "week" = "week"))

Risposte

1 r2evans Oct 12 2020 at 21:56
a %>%
  group_by(date, code, week) %>%
  summarize(count = sum(count)) %>%
  ungroup() %>%
  left_join(b, ., by = c("date", "code", "week"))
#         date  color name  code week count
# 1 2020-06-07   Blue    A 13309   23     9
# 2 2020-06-07 Yellow    B 13309   23     9
# 3 2020-06-07 Purple    D 13309   23     9
# 4 2020-07-12 Yellow    A 18099   28    14
# 5 2020-07-12   Blue    E 18099   28    14
EvanM Oct 12 2020 at 22:15

Eri vicino alla chiamata a, right_join()ma prima di ciò, la prima cosa che dovresti fare è totalizzare il primo frame di dati in modo da avere una somma dei conteggi. Puoi farlo manualmente con, summarize()ma un modo più semplice è usare un data frame nidificato e creare una nuova colonna che somma i conteggi.

Fammi sapere se hai bisogno di chiarimenti?

La prossima volta pubblica i tuoi dati in un formato più facile da copiare e incollare in R.

library(tidyverse)

dfA <- tribble(~date, ~count, ~code, ~week,
               "2020-06-07",     4,      13309,    23,
               "2020-06-07",     5,      13309,    23,
               "2020-07-12",     6,      18099,    28,
               "2020-07-12",     8,      18099,    28)

dfB <- tribble(~date, ~color, ~name, ~code, ~week,
               "2020-06-07", "Blue", "A", 13309, 23,
               "2020-06-07", "Yellow", "B", 13309, 23,
               "2020-06-07", "Purple", "D", 13309, 23,
               "2020-07-12", "Yellow", "A", 18099, 28,
               "2020-07-12", "Blue", "E", 18099, 28)

total_counts <- dfA %>% 
  group_by(date, code, week) %>% 
  nest() %>% 
  mutate(count= map_dbl(data, sum)) %>% 
  select(date, count, code, week) %>% 
   right_join(dfB) %>% 
  select(date, color, name, code, week, count)
#> Joining, by = c("date", "code", "week")

total_counts

#> # A tibble: 5 x 6
#> # Groups:   date, code, week [2]
#>   date       color  name   code  week count
#>   <chr>      <chr>  <chr> <dbl> <dbl> <dbl>
#> 1 2020-06-07 Blue   A     13309    23     9
#> 2 2020-06-07 Yellow B     13309    23     9
#> 3 2020-06-07 Purple D     13309    23     9
#> 4 2020-07-12 Yellow A     18099    28    14
#> 5 2020-07-12 Blue   E     18099    28    14

Creato il 12-10-2020 dal pacchetto reprex (v0.3.0)

akrun Oct 12 2020 at 22:41

Utilizzando join by data.table

library(data.table)
setDT(a)[, .(count = sum(count)), .(date, code, week)][b,
      on = .(date, code, week)]
#         date  code week count  color name
#1: 2020-06-07 13309   23     9   Blue    A
#2: 2020-06-07 13309   23     9 Yellow    B
#3: 2020-06-07 13309   23     9 Purple    D
#4: 2020-07-12 18099   28    14 Yellow    A
#5: 2020-07-12 18099   28    14   Blue    E