Padatkan dan gabungkan bingkai data

Oct 12 2020

Saya memiliki kerangka data yang saya coba gabungkan dengan yang lain, dan saya mengalami beberapa masalah yang saya yakini dapat ditelusuri kembali ke fakta bahwa setiap pengamatan adalah insiden, bukan jumlah kumulatif. Saya memiliki bingkai data di bawah ini di mana setiap baris adalah pengamatan individu, dan saya kemudian akan menggunakan weekdan codeuntuk menggabungkannya dengan bingkai data lain berdasarkan variabel yang sama weekdan code.

bingkai data amemiliki setiap baris sebagai pengamatan khusus, tetapi saya membutuhkannya untuk menjadi pengamatan kumulatif / baris dengan kode / tanggal. Saya benar-benar bingung.

  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

perlu menjadi

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

Kemudian, akan dapat digabungkan dengan bingkai data 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

dan hasil akhirnya adalah

  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

Saya awalnya menggunakan kode di bawah ini untuk melakukan ini, tetapi itu benar-benar meledakkan bingkai data saya. Dimensi saya berubah dari dim(a) == (209807, 86)menjadi dim(merged) == (1367029, 89). Saya mencoba beberapa jenis gabungan (kanan, kiri, dalam, dll.) Tetapi semuanya masih meledakkan bingkai data (bervariasi dengan beberapa pengamatan sekitar 100, tetapi masih menghasilkan lebih dari satu juta baris). Itulah mengapa saya berpikir masalahnya adalah karena asetiap observasi vs observasi ringkasan untuk kode tertentu pada tanggal tertentu.

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

Jawaban

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

Anda sudah dekat dengan panggilan ke right_join()tetapi sebelum itu, hal pertama yang harus Anda lakukan adalah menjumlahkan bingkai data pertama sehingga Anda memiliki jumlah hitungan. Anda dapat melakukannya secara manual summarize()tetapi cara yang lebih mudah adalah menggunakan bingkai data bersarang dan membuat kolom baru yang menjumlahkan hitungan.

Beri tahu saya jika Anda membutuhkan klarifikasi?

Lain kali silahkan posting data Anda dalam format yang lebih mudah untuk di copy dan paste ke 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

Dibuat pada 2020-10-12 oleh paket reprex (v0.3.0)

akrun Oct 12 2020 at 22:41

Menggunakan 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