неверный вывод для функции statar :: xtile при использовании с dplyr - PullRequest
1 голос
/ 27 января 2020

Я столкнулся с некоторой проблемой при попытке использовать функцию statar :: xtile вместе с dplyr.

У меня есть набор данных с именем "resp_rate" следующим образом:

userid  group_id    group_resp_rate
63775658    514 0.0315789
64880613    514 0.0315789
65051746    553 0.0035461
66689882    554 0.0000000
68839217    555 0.0038023
70630920    555 0.0038023
73773882    554 0.0000000
74279814    524 0.0000000
74461297    555 0.0038023
74951919    553 0.0035461
75523813    514 0.0315789
75932923    554 0.0000000
76678559    554 0.0000000
77506998    554 0.0000000
79261032    514 0.0315789
79860954    555 0.0038023
80016586    554 0.0000000
81757979    515 0.0106383
82565883    534 0.0000000
82610815    513 0.0212766

Мне нужно разделить клиентов на 3 группы на основе group_resp_rate. Группы не должны быть одинакового размера.

При использовании xtile из statar напрямую все работает. Например:

resp_rate$group_index1 <- xtile(resp_rate$group_resp_rate, n=3)

Однако, когда я использую xtile с dplyr, это приводит только к одному индексу уровня:

resp_prob <- resp_prob %>% mutate(group_index2 = xtile(group_resp_rate, n=3))

Это результирующий набор данных:

userid  group_id    group_resp_rate group_index1    group_index2
63775658    514 0.0315789   3   1
64880613    514 0.0315789   3   1
65051746    553 0.0035461   2   1
66689882    554 0.0000000   1   1
68839217    555 0.0038023   2   1
70630920    555 0.0038023   2   1
73773882    554 0.0000000   1   1
74279814    524 0.0000000   1   1
74461297    555 0.0038023   2   1
74951919    553 0.0035461   2   1
75523813    514 0.0315789   3   1
75932923    554 0.0000000   1   1
76678559    554 0.0000000   1   1
77506998    554 0.0000000   1   1
79261032    514 0.0315789   3   1
79860954    555 0.0038023   2   1
80016586    554 0.0000000   1   1
81757979    515 0.0106383   3   1
82565883    534 0.0000000   1   1
82610815    513 0.0212766   3   1

Может кто-нибудь сообщить мне, почему это происходит? Очень ценю это!

1 Ответ

0 голосов
/ 27 января 2020

«resp_rate» - это используемый объект, и если мы делаем с этим объектом, он работает.

library(statar)
library(dplyr)
resp_rate %>%
    mutate(group_index2 = xtile(group_resp_rate, n=3))
#      userid group_id group_resp_rate group_index2
#1  63775658      514       0.0315789            3
#2  64880613      514       0.0315789            3
#3  65051746      553       0.0035461            2
#4  66689882      554       0.0000000            1
#5  68839217      555       0.0038023            2
#6  70630920      555       0.0038023            2
#7  73773882      554       0.0000000            1
#8  74279814      524       0.0000000            1
#9  74461297      555       0.0038023            2
#10 74951919      553       0.0035461            2
#11 75523813      514       0.0315789            3
#12 75932923      554       0.0000000            1
#13 76678559      554       0.0000000            1
#14 77506998      554       0.0000000            1
#15 79261032      514       0.0315789            3
#16 79860954      555       0.0038023            2
#17 80016586      554       0.0000000            1
#18 81757979      515       0.0106383            3
#19 82565883      534       0.0000000            1
#20 82610815      513       0.0212766            3

Возможно, что OP загрузил данные, которые также включают атрибут group, то есть ниже повторяет поведение, показанное в посте OP

resp_rate %>%
    group_by(group_id) %>%
    mutate(group_index2 = xtile(group_resp_rate, n=3))
# A tibble: 20 x 4
# Groups:   group_id [8]
#     userid group_id group_resp_rate group_index2
#      <int>    <int>           <dbl>        <int>
# 1 63775658      514         0.0316             1
# 2 64880613      514         0.0316             1
# 3 65051746      553         0.00355            1
# 4 66689882      554         0                  1
# 5 68839217      555         0.00380            1
# 6 70630920      555         0.00380            1
# 7 73773882      554         0                  1
# 8 74279814      524         0                  1
# 9 74461297      555         0.00380            1
#10 74951919      553         0.00355            1
#11 75523813      514         0.0316             1
#12 75932923      554         0                  1
#13 76678559      554         0                  1
#14 77506998      554         0                  1
#15 79261032      514         0.0316             1
#16 79860954      555         0.00380            1
#17 80016586      554         0                  1
#18 81757979      515         0.0106             1
#19 82565883      534         0                  1
#20 82610815      513         0.0213             1

В таких случаях, сделайте ungroup, а затем выполните mutate

resp_rate %>%
   ungroup %>%
   mutate(group_index2 = xtile(group_resp_rate, n=3))

Когда мы извлекаем столбец как вектор и применяем к нему xtile, атрибут отсутствует, и именно поэтому работает автономный код

данные

resp_rate <- structure(list(userid = c(63775658L, 64880613L, 65051746L, 66689882L, 
68839217L, 70630920L, 73773882L, 74279814L, 74461297L, 74951919L, 
75523813L, 75932923L, 76678559L, 77506998L, 79261032L, 79860954L, 
80016586L, 81757979L, 82565883L, 82610815L), group_id = c(514L, 
514L, 553L, 554L, 555L, 555L, 554L, 524L, 555L, 553L, 514L, 554L, 
554L, 554L, 514L, 555L, 554L, 515L, 534L, 513L), group_resp_rate = c(0.0315789, 
0.0315789, 0.0035461, 0, 0.0038023, 0.0038023, 0, 0, 0.0038023, 
0.0035461, 0.0315789, 0, 0, 0, 0.0315789, 0.0038023, 0, 0.0106383, 
0, 0.0212766)), class = "data.frame", row.names = c(NA, -20L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...