R создайте сводный фрейм данных, содержащий столбец пропорций, после группировки полных комбинаций из другого столбца

#r #tidy

Вопрос:

Вот скриншот фрейма данных, с которым я работаю.

Я также включаю сюда dput(head(df, n = 50)).

введите описание изображения здесь

 structure(list(conversion_hash_id = c("0001cd061567445d62e91e9d5c28c004", 
"0001cd061567445d62e91e9d5c28c004", "0003bc99a5039e664fd71dab54d7d533", 
"0003c6d107ae3dc12174eee321ee4589", "0006ba6c297c921e745ebe624c61b3c2", 
"0007dbcbc304375c09d6cd650a144cd1", "00093c82a4a8fb0827833960fabb5e1a", 
"000a508ea789bbad8e9e832bb1c2b787", "000d383e749beb47f8c93ec3a05a1b4a", 
"00106ff98badafd53709fbb617052bb6", "0010a4d7e4f77d5c0ce684499a529ce2", 
"00131c89636a6d0f37ae93fe6da4144e", "001dcc2ff0655c7dd8243b86ad461cff", 
"002097d1eb159f92b43a6dc0510d9b08", "0020c1e9b159733d2d3ba9912c795382", 
"0020c1e9b159733d2d3ba9912c795382", "00212acae3e183252078bdfd2c3963e3", 
"00212acae3e183252078bdfd2c3963e3", "0023ff241f1c71743146300098021297", 
"002f421d2a3ad29afd9cb15807ce1f0f", "00316ec40c99e9d8b53b4834386b0476", 
"003593dce8e41b1a2a544b16196cc6a1", "00389f0ef15d13e4ec2eec7a1ac03240", 
"003c69e077ba1ccbf051a229f5fc627a", "00415d4cd157e3f256976d0e9f5dab19", 
"0041723c94fa240eea4e6245513e7213", "0043e1fd2c4ef8c1da1959a3f4dd0362", 
"0043e1fd2c4ef8c1da1959a3f4dd0362", "004a2bcbef69fb0d334b675583cdb873", 
"004df76075f83c1c6de314ff785aa0d7", "004df76075f83c1c6de314ff785aa0d7", 
"005090f2bf5796a2cbe693e43e70d653", "0051d01a74e467cb91d779ed064f7dda", 
"0052ef5a56f4a24011abe9a1a7242f49", "00592654753f3ef738a6f93227f3dd61", 
"005af6fca539bb39a4c88713b0c9df2b", "005d62d75f8ecf29e7a3c8571b6f9bf6", 
"005de06981b347a4af1f104fb3c7c6f2", "005dea5fc43528e8a4f00d172308cbea", 
"0060afd14a7edd637d99ded56429ab4a", "00669dae25369a8655199c54aec4c229", 
"00679670a8f30a3b59b9dd803c2aa48c", "006a9b088b768bbabb6d77cd6b44f763", 
"006af62acaac8b6d8b620a170f09e71b", "006c137bd6884d985e2e0724c45ad2ab", 
"006c83b0f6c0a8e3773a63c85f34c3c7", "006fc42950d4a610baaef0f66ded0819", 
"00716fcf53da8f347571e387e1beae6d", "00716fcf53da8f347571e387e1beae6d", 
"0073cee456597683aaecc9434a18eda3"), tier_1 = c("OTT", "Paid Search", 
"OTT", "Email", "Paid Search", "Paid Search", "Email", "Paid Social", 
"Paid Social", "Paid Search", "Direct", "Email", "Paid Search", 
"Paid Social", "Paid Search", "Paid Social", "Organic Search", 
"Paid Search", "Paid Social", "Organic Search", "Direct", "Paid Search", 
"Paid Video", "Direct", "Email", "Paid Search", "Affiliate", 
"Email", "Paid Search", "OTT", "Paid Search", "Paid Search", 
"Email", "Direct", "Direct", "Paid Search", "Organic Search", 
"Paid Search", "Paid Search", "Paid Search", "Paid Social", "Direct", 
"Organic Search", "Paid Search", "Email", "Paid Search", "Paid Social", 
"Paid Search", "Paid Social", "Organic Social"), normalized = c(0.4287711836, 
0.5712288164, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.7237434946, 
0.2762565054, 0.3000477093, 0.6999522907, 1, 1, 1, 1, 1, 1, 1, 
1, 0.5447557896, 0.4552442104, 1, 0.3493884477, 0.6506115523, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.700741097, 
0.299258903, 0.5210938212)), row.names = c(NA, -50L), groups = structure(list(
    conversion_hash_id = c("0001cd061567445d62e91e9d5c28c004", 
    "0003bc99a5039e664fd71dab54d7d533", "0003c6d107ae3dc12174eee321ee4589", 
    "0006ba6c297c921e745ebe624c61b3c2", "0007dbcbc304375c09d6cd650a144cd1", 
    "00093c82a4a8fb0827833960fabb5e1a", "000a508ea789bbad8e9e832bb1c2b787", 
    "000d383e749beb47f8c93ec3a05a1b4a", "00106ff98badafd53709fbb617052bb6", 
    "0010a4d7e4f77d5c0ce684499a529ce2", "00131c89636a6d0f37ae93fe6da4144e", 
    "001dcc2ff0655c7dd8243b86ad461cff", "002097d1eb159f92b43a6dc0510d9b08", 
    "0020c1e9b159733d2d3ba9912c795382", "00212acae3e183252078bdfd2c3963e3", 
    "0023ff241f1c71743146300098021297", "002f421d2a3ad29afd9cb15807ce1f0f", 
    "00316ec40c99e9d8b53b4834386b0476", "003593dce8e41b1a2a544b16196cc6a1", 
    "00389f0ef15d13e4ec2eec7a1ac03240", "003c69e077ba1ccbf051a229f5fc627a", 
    "00415d4cd157e3f256976d0e9f5dab19", "0041723c94fa240eea4e6245513e7213", 
    "0043e1fd2c4ef8c1da1959a3f4dd0362", "004a2bcbef69fb0d334b675583cdb873", 
    "004df76075f83c1c6de314ff785aa0d7", "005090f2bf5796a2cbe693e43e70d653", 
    "0051d01a74e467cb91d779ed064f7dda", "0052ef5a56f4a24011abe9a1a7242f49", 
    "00592654753f3ef738a6f93227f3dd61", "005af6fca539bb39a4c88713b0c9df2b", 
    "005d62d75f8ecf29e7a3c8571b6f9bf6", "005de06981b347a4af1f104fb3c7c6f2", 
    "005dea5fc43528e8a4f00d172308cbea", "0060afd14a7edd637d99ded56429ab4a", 
    "00669dae25369a8655199c54aec4c229", "00679670a8f30a3b59b9dd803c2aa48c", 
    "006a9b088b768bbabb6d77cd6b44f763", "006af62acaac8b6d8b620a170f09e71b", 
    "006c137bd6884d985e2e0724c45ad2ab", "006c83b0f6c0a8e3773a63c85f34c3c7", 
    "006fc42950d4a610baaef0f66ded0819", "00716fcf53da8f347571e387e1beae6d", 
    "0073cee456597683aaecc9434a18eda3"), .rows = structure(list(
        1:2, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
        14L, 15:16, 17:18, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
        26L, 27:28, 29L, 30:31, 32L, 33L, 34L, 35L, 36L, 37L, 
        38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48:49, 
        50L), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -44L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))
 

Мне нужно создать сводный фрейм данных с некоторой логикой, которую я не знаю, как создать.

Что мне нужно сделать, так это сгруппировать каждый идентификатор conversion_hash_id, который относится к одному и тому же набору категорий tier_1, и подсчитать общее количество появлений.

Например, если существует 30 различных идентификаторов conversion_hash_id, которые отличаются друг от друга, но каждый из них указан дважды, один раз для OTT и один раз для платного поиска, мне нужно подсчитать, сколько раз появлялась эта комбинация.

Вот как может выглядеть новый фрейм данных. Это просто выдуманные цифры для пары случаев. Возможно, есть и другие возможности для того, как может выглядеть структура финальной таблицы. Я не перечислил здесь все случаи.

 group                   count
OTT, Paid Search         30 
OTT, Paid Social         25
 

Комментарии:

1. Является ли ваш ожидаемый результат фиктивным или значения верны? Возможно df %>% group_by(tier_1) %>% summarise(n = n_distinct(conversion_hash_id), conversion_hash_id = list(unique(conversion_hash_id))) %>% mutate(prop = n/sum(n)) %>% unnest(conversion_hash_id)

2. Привет @akrun спасибо за быстрый ответ. На самом деле я только что отредактировал сообщение, надеюсь, теперь оно более четкое

3. Этот сгруппированный вывод является всего лишь примером с составленными числами.

4. Возможно, на основе новых результатов df %>% group_by(conversion_hash_id) %>% summarise(group = toString(sort(unique(tier_1)))) %>% count(group)

5. Удивительный ответ, очень лаконичный и именно то, что мне нужно.

Ответ №1:

После группировки по «conversion_hash_id» summarise со значениями sort ed unique «tier_1» в виде одной строки с помощью paste ing ( toString paste(..., collapse=", ") ), а затем получите столбец count «группа»

 library(dplyr)
df %>%
    group_by(conversion_hash_id) %>%
    summarise(group = toString(sort(unique(tier_1)))) %>%
    count(group)