Padatkan dan gabungkan bingkai data
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
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
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)
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