【问题标题】:dplyr: comparing values within a variable dependent on another variabledplyr:比较依赖于另一个变量的变量中的值
【发布时间】:2019-02-20 13:18:45
【问题描述】:

如何使用 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 而不是循环来解决这个问题,因为我想将它配合到进一步的数据处理步骤中。

【问题讨论】:

    标签: r dplyr choice


    【解决方案1】:

    看看能不能解决:

    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
    

    【讨论】:

    • 我喜欢这种方法,但它 mutate(x = cumsum()) 确实会产生以下错误: mutate_impl(.data, dots) 中的错误:与请求的类型不兼容:[type=character;目标=双]。
    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多