Когда mutate нуждается в дополнительных аргументах из разных подмножеств переменных и циклов - dplyr и tidyverse применяются к области образования - PullRequest
0 голосов
/ 16 марта 2020

Допустим, у меня есть тестовая оценка, оцененная по трем временным точкам. Таким образом, каждый участник имеет индивидуальный балл на уровне T1 (базовый уровень), T2 (после вмешательства) и T3 (3-месячный период наблюдения). На изображении ниже показан текущий набор данных.

Time score

Я хотел бы добавить новую двоичную переменную (1/0), если результат второй оценки (После вмешательства) было меньше 0,5 (или больше), чем первая оценка (базовый уровень) и так далее. Следовательно, первый участник (id_1 == 1) получит 1 к этой переменной (потому что 1,5 - 0,8 = 0,7 и 0,7 -> 0,5). Тот же участник через 3 месяца наблюдения получит 0, потому что 0,8 - 0,5 = 0,3, и этот результат не> 0,5.

Second ds

обоснование моего вопроса предлагает мне использовать 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))

1 Ответ

1 голос
/ 16 марта 2020

Когда я правильно понял, это можно сделать так. Сгруппируйте по идентификатору, добавьте значение задержки, проверьте, больше ли разница, чем .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

Создано в 2020-03-16 пакетом представлением (v0.3.0 )

...