dplyr: сравнение значений в переменной, зависящей от другой переменной - PullRequest
0 голосов
/ 20 февраля 2019

Как я могу сравнить значения в переменной, зависящей от другой переменной, с помощью dplyr?

Значение df основано на данных выбора (длинный формат) из опроса.Он имеет одну переменную, которая указывает участников id , другую, которая указывает на выбор inst ance, и одну, которая указывает, какой alt ernative был выбран.В моих данных я чувствую, что многие люди устают от этой задачи и поэтому придерживаются одной альтернативы для каждого случая.Поэтому я хотел бы определить людей, которые всегда выбирали одну и ту же опцию от определенного экземпляра до конца.

Вот пример df:

set.seed(0)
df <- tibble(
    id = rep(1:5,each=12),
    inst = rep(1:12,5),
    alt = sample(1:3, size =60, replace=T),
)

Это выглядит следующим образом:

   id     inst alt
1   1        1   3
2   1        2   1
3   1        3   2
4   1        4   2
5   1        5   3
6   1        6   1
7   1        7   3
8   1        8   3
9   1        9   2
10  1       10   2
11  1       11   1   <-
12  1       12   1   <-
13  2        1   1
14  2        2   3
...

Я хотел бы создать две новые переменные count и count_alt .Новая переменная count должна указывать, как часто одно и то же значение появляется в alt на основе id и inst , считая только значения с конца id .Таким образом, для участника (id == 1) переменная count должна быть равна 2, поскольку альтернатива 1 была выбрана в последних двух случаях (11 и 12). count_alt будет принимать значение 1 (всегда то же самое, что inst == 12)

Новый df должен выглядеть следующим образом

 id     inst   alt   count   count_alt
1   1        1   3       2           1
2   1        2   1       2           1
3   1        3   2       2           1
4   1        4   2       2           1
5   1        5   3       2           1
6   1        6   1       2           1
7   1        7   3       2           1
8   1        8   3       2           1
9   1        9   2       2           1
10  1       10   2       2           1
11  1       11   1       2           1
12  1       12   1       2           1     
...

Я бы предпочелРешите это с помощью dplyr, а не с помощью цикла, так как я хочу включить его в дальнейшие шаги по обработке данных.

1 Ответ

0 голосов
/ 20 февраля 2019

Посмотрим, решит ли это это:

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(
    count = cumsum(alt != lag(alt, default = "rndm")),
    count = sum(count == max(count)),
    count_alt = alt[n()]
  )

Вывод:

   id inst alt count count_alt
1   1    1   3     2         1
2   1    2   1     2         1
3   1    3   2     2         1
4   1    4   2     2         1
5   1    5   3     2         1
6   1    6   1     2         1
7   1    7   3     2         1
8   1    8   3     2         1
9   1    9   2     2         1
10  1   10   2     2         1
11  1   11   1     2         1
12  1   12   1     2         1
13  2    1   1     1         2
14  2    2   3     1         2
15  2    3   2     1         2
16  2    4   3     1         2
17  2    5   2     1         2
18  2    6   3     1         2
19  2    7   3     1         2
20  2    8   2     1         2
21  2    9   3     1         2
22  2   10   3     1         2
23  2   11   1     1         2
24  2   12   2     1         2
25  3    1   1     1         3
26  3    2   1     1         3
27  3    3   2     1         3
28  3    4   1     1         3
29  3    5   2     1         3
30  3    6   3     1         3
31  3    7   2     1         3
32  3    8   2     1         3
33  3    9   2     1         3
34  3   10   2     1         3
35  3   11   1     1         3
36  3   12   3     1         3
37  4    1   3     1         1
38  4    2   3     1         1
39  4    3   1     1         1
40  4    4   3     1         1
41  4    5   2     1         1
42  4    6   3     1         1
43  4    7   2     1         1
44  4    8   3     1         1
45  4    9   2     1         1
46  4   10   2     1         1
47  4   11   3     1         1
48  4   12   1     1         1
49  5    1   2     2         2
50  5    2   3     2         2
51  5    3   3     2         2
52  5    4   2     2         2
53  5    5   3     2         2
54  5    6   2     2         2
55  5    7   1     2         2
56  5    8   1     2         2
57  5    9   1     2         2
58  5   10   1     2         2
59  5   11   2     2         2
60  5   12   2     2         2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...