Condensa e unisci frame di dati
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
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
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)
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