首页 > 解决方案 > dplyr:比较依赖于另一个变量的变量中的值

问题描述

如何将依赖于另一个变量的变量中的值与 dplyr 进行比较?

df 基于来自调查的选择数据(长格式)。它有一个变量表示参与者id,另一个表示选择实例,还有一个表示选择了哪个备选方案。在我的数据中,我感觉很多人倾向于对这项任务感到厌倦,因此在每种情况下都坚持使用一种替代方案。因此,我想找出从某个实例开始到最后总是选择相同选项的人。

这是一个例子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
...

我想创建两个新变量countcount_alt。新变量count应指示基于idinst相同值出现在alt中的频率,仅计算id末尾的值。因此,对于参与者 (id==1),计数变量应为 2,因为在最后两个实例(11 和 12)中选择了替代 1。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 而不是循环来解决这个问题,因为我想将它配合到进一步的数据整理步骤中。

标签: rdplyrchoice

解决方案


看看能不能解决:

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

推荐阅读