dplyr:比较依赖于另一个变量的变量内的值

js4nwp54  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(181)

如何用dplyr比较一个依赖于另一个变量的变量内的值?
df基于选择数据(长格式)。它有一个变量表示参与者 id,另一个指示选择的 * instance *,一个指示选择了哪个 alternative。在我的数据中,我感觉很多人倾向于厌倦这项任务,因此在每一个示例中坚持一个选择。因此,我想找出那些从某个时刻起直到最后总是选择同一个选项的人。
下面是一个示例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)count 变量应为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而不是循环来解决这个问题,因为我想把它放到进一步的数据处理步骤中。

fnvucqvd

fnvucqvd1#

看看这样能不能解决问题:

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

相关问题