【问题标题】:When mutate needs extra arguments from different subset of variables and loops -- dplyr and tidyverse applied to educational field当 mutate 需要来自不同变量和循环子集的额外参数时——dplyr 和 tidyverse 应用于教育领域
【发布时间】:2020-03-16 18:18:18
【问题描述】:

假设我有一个超过三个时间点的考试成绩。因此,每个参与者在 T1(基线)、T2(干预后)和 T3(3 个月随访)都有一个单独的分数。下图显示了当前的数据集。

如果第二次评估(干预后)的结果小于第一次评估(基线)的 0.5(或更多),我想添加一个新的二元变量 (1/0),依此类推。因此,第一个参与者 (id_1 == 1) 将收到该变量的 1(因为 1.5 - 0.8 = 0.7 且 0.7 > 0.5)。同一参与者在 3 个月的随访中将得到 0,因为 0.8 - 0.5 = 0.3,这个结果不 > 0.5。

我的问题背后的理由建议我使用 mutate,但是一旦结果是两个变量和“循环”的条件,我就很难处理这个问题。

我想继续使用 tidyverse 环境,下面的代码让这个问题很容易重现。

谢谢

ds <-structure(list(id_1 = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 
                             5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 
                             11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 
                             17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 
                             22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 
                             27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 
                             33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 
                             38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 
                             43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 
                             49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 
                             54, 54, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                             NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                             NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                             NA, NA, NA, NA, NA, NA, NA, NA), time = structure(c(1L, 2L, 3L, 
                                                                                 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                                 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                                 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                                 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, NA, 
                                                                                 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                 NA, NA, NA, NA, NA), .Label = c("Baseline", "Post-intervention", 
                                                                                                                 "3-month follow-up"), class = "factor"), acq_6 = c(1.5, 0.8, 
                                                                                                                                                                    0.5, 1, 0, NA, 0.5, 0.5, 0.3, 3.1, 1.5, NA, 3.1, 0.8, 1.2, 1, 
                                                                                                                                                                    0.3, 0, 3.8, 2.7, 0.3, 4, 2, NA, 0.5, 0.8, 1, 2.2, 2.1, NA, 1.5, 
                                                                                                                                                                    0.7, 0.7, 1.9, 0.5, 0.3, 3.7, 1.9, 2.5, 0.8, 1.3, 1, 2, 3.3, 
                                                                                                                                                                    3.3, 2.1, 1.6, 2.2, 2.2, 1.3, 2.3, 2, 0.5, 0.5, 1.7, 1.9, 1.5, 
                                                                                                                                                                    1.8, 1.4, NA, 2.9, 1.8, 0.3, 1.8, 1.3, 1.5, 1.3, 1, 0, 2.6, 0.7, 
                                                                                                                                                                    1, 2.1, 1.8, 1.8, 3.3, 2.6, 3, 1.2, NA, NA, 0.7, NA, NA, 1, NA, 
                                                                                                                                                                    NA, 0.7, 0.9, 0.5, 1, 0.6, NA, 3.3, 0.2, NA, 1, 0.7, 1.3, 1.7, 
                                                                                                                                                                    2.3, NA, 1.7, 1.6, 1.6, 2.5, 1.2, 2, 2.5, 2.8, 3.8, 0.7, 0, 0.2, 
                                                                                                                                                                    1.2, 2.2, NA, 1.2, 1.8, 2, 2.5, 1.8, 2.2, 2, 1.7, NA, 1.7, 2.5, 
                                                                                                                                                                    2, 1.8, 2.5, 1.8, 1.8, 3.2, 3.3, 0.6, 0.5, 1, 2.9, 1.8, 2.6, 
                                                                                                                                                                    1, 0.5, 1.2, 0.8, 0.7, 1, 1.8, 1.5, 1.8, 1.7, 0.7, 1, 1.2, 1, 
                                                                                                                                                                    0.9, 1.8, NA, NA, 2.6, 2.3, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                                                                                                    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                                                                                                    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                                                                                                                                                                    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = c("tbl_df", 
                                                                                                                                                                                                                                        "tbl", "data.frame"), row.names = c(NA, -216L))

【问题讨论】:

    标签: r loops dplyr tidyverse case-when


    【解决方案1】:

    当我得到正确的 ypu 时,可以这样实现。按id分组,添加滞后值,检查差值是否大于0.5:

    library(dplyr)
    
    ds <- structure(list(id_1 = c(
      1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
      5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11,
      11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16,
      17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22,
      22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27,
      27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32,
      33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38,
      38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43,
      43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48,
      49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54,
      54, 54, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA
    ), time = structure(c(
      1L, 2L, 3L,
      1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L,
      2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L,
      3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L,
      1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L,
      2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L,
      3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L,
      1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L,
      2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L,
      3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L,
      1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA
    ), .Label = c(
      "Baseline", "Post-intervention",
      "3-month follow-up"
    ), class = "factor"), acq_6 = c(
      1.5, 0.8,
      0.5, 1, 0, NA, 0.5, 0.5, 0.3, 3.1, 1.5, NA, 3.1, 0.8, 1.2, 1,
      0.3, 0, 3.8, 2.7, 0.3, 4, 2, NA, 0.5, 0.8, 1, 2.2, 2.1, NA, 1.5,
      0.7, 0.7, 1.9, 0.5, 0.3, 3.7, 1.9, 2.5, 0.8, 1.3, 1, 2, 3.3,
      3.3, 2.1, 1.6, 2.2, 2.2, 1.3, 2.3, 2, 0.5, 0.5, 1.7, 1.9, 1.5,
      1.8, 1.4, NA, 2.9, 1.8, 0.3, 1.8, 1.3, 1.5, 1.3, 1, 0, 2.6, 0.7,
      1, 2.1, 1.8, 1.8, 3.3, 2.6, 3, 1.2, NA, NA, 0.7, NA, NA, 1, NA,
      NA, 0.7, 0.9, 0.5, 1, 0.6, NA, 3.3, 0.2, NA, 1, 0.7, 1.3, 1.7,
      2.3, NA, 1.7, 1.6, 1.6, 2.5, 1.2, 2, 2.5, 2.8, 3.8, 0.7, 0, 0.2,
      1.2, 2.2, NA, 1.2, 1.8, 2, 2.5, 1.8, 2.2, 2, 1.7, NA, 1.7, 2.5,
      2, 1.8, 2.5, 1.8, 1.8, 3.2, 3.3, 0.6, 0.5, 1, 2.9, 1.8, 2.6,
      1, 0.5, 1.2, 0.8, 0.7, 1, 1.8, 1.5, 1.8, 1.7, 0.7, 1, 1.2, 1,
      0.9, 1.8, NA, NA, 2.6, 2.3, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
    )), class = c(
      "tbl_df",
      "tbl", "data.frame"
    ), row.names = c(NA, -216L))
    
    ds %>% 
      group_by(id_1) %>% 
      mutate(acq_6_lag = lag(acq_6),
             get_better = ifelse(acq_6_lag - acq_6 > .5, 1, 0))
    #> # A tibble: 216 x 5
    #> # Groups:   id_1 [55]
    #>     id_1 time              acq_6 acq_6_lag get_better
    #>    <dbl> <fct>             <dbl>     <dbl>      <dbl>
    #>  1     1 Baseline            1.5      NA           NA
    #>  2     1 Post-intervention   0.8       1.5          1
    #>  3     1 3-month follow-up   0.5       0.8          0
    #>  4     2 Baseline            1        NA           NA
    #>  5     2 Post-intervention   0         1            1
    #>  6     2 3-month follow-up  NA         0           NA
    #>  7     3 Baseline            0.5      NA           NA
    #>  8     3 Post-intervention   0.5       0.5          0
    #>  9     3 3-month follow-up   0.3       0.5          0
    #> 10     4 Baseline            3.1      NA           NA
    #> # ... with 206 more rows
    

    reprex package (v0.3.0) 于 2020-03-16 创建

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2021-10-15
      • 1970-01-01
      • 2015-12-26
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多