J'ai des données de pression artérielle posturale (pouls, systolique et diastolique à 3 moments), ainsi que d'autres variables clés et je souhaite créer des versions soignées des données de pression artérielle.
J'ai essayé d'utiliser rassembl () pour un seul type de variable (par exemple systolique) qui fonctionne, mais pas en faisant les 3 (59 participants originaux, devient 1593 lorsque trois fonctions de collecte () sont reliées ensemble).
tidybp # A tibble: 15 x 9 ID group measure_1 systolic_posture systolic diastolic_posture diastolic pulse_posture pulse <dbl> <dbl> <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> 1 1138 1 8 systolic_lying 169 2 430 1 14 systolic_lying 141 3 245 2 6 systolic_lying 144 4 1431 3 11 systolic_lying 120 5 1587 4 28 systolic_lying 88 6 1138 1 8 systolic_standing_1 163 7 430 1 14 systolic_standing_1 156 8 245 2 6 systolic_standing_1 129 9 1431 3 11 systolic_standing_1 127 10 1587 4 28 systolic_standing_1 102 11 1138 1 8 systolic_standing_3 179 12 430 1 14 systolic_standing_3 152 13 245 2 6 systolic_standing_3 146 14 1431 3 11 systolic_standing_3 127 15 1587 4 28 systolic_standing_3 106
Utiliser rassembler sur une seule des variables fonctionne par exemple
tidybp <- gather(bp, "systolic_posture", "systolic", systolic_lying:systolic_standing_3) > tidybp <- gather(tidybp, "diastolic_posture", "diastolic", diastolic_lying:diastolic_standing_3) > tidybp <- gather(tidybp, "pulse_posture", "pulse", pulse_lying:pulse_standing_3) > dim(tidybp) [1] 135 9 #each subsequent iteration triples the number of observations
Cependant, cela laisse tout le diastolic_lying, diastolic_standing_1 ... pulse_standing_1 pulse_standing_3 toujours étalé.
Quand j'ai ensuite pris tidybp
et utilisé rassembler pour apporter le eg variables diastoliques ensemble, il a triplé la longueur de la boucle df en boucle les données systoliques rassemblées.
tidybp <- gather(bloodpressure, "systolic_posture", "systolic", systolic_lying:systolic_standing_3) dim(tidybp) [1] 15 11 #This is what I expect. head(tidybp[c(1:3, 10:11)]) # A tibble: 6 x 5 ID group measure_1 systolic_posture systolic <dbl> <dbl> <dbl> <chr> <dbl> 1 1587 4 28 systolic_lying 88 2 1138 1 8 systolic_standing_1 163 3 430 1 14 systolic_standing_1 156 4 245 2 6 systolic_standing_1 129 5 1431 3 11 systolic_standing_1 127 6 1587 4 28 systolic_standing_1 102
Ce que je vise est:
library(tidyverse) ID <- c(1138, 430, 245, 1431, 1587) group <- c(1, 1, 2, 3, 4) measure_1 <- c(8, 14, 6, 11, 28) systolic_lying <- c(169, 141, 144, 120, 88) systolic_standing_1 <- c(163, 156, 129, 127, 102) systolic_standing_3 <- c(179, 152, 146, 127, 106) diastolic_lying <- c(80, 93, 80, 71, 66) diastolic_standing_1 <-c(87, 97, 79, 77, 75) diastolic_standing_3 <-c(92, 100, 83, 79, 77) pulse_lying <-c(58, 71, 58, 63, 98) pulse_lying_1 <- c(62, 93, 61, 70, 73) pulse_lying_3 <- c(67, 97, 63, 71, 76) bp <- tibble(ID, group, measure_1, systolic_lying, systolic_standing_1, systolic_standing_3, diastolic_lying, diastolic_standing_1, diastolic_standing_3, pulse_lying, pulse_lying_1, pulse_lying_3) head(bp) # A tibble: 5 x 12 ID group measure_1 systolic_lying systolic_standi⦠systolic_standi⦠<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1138 1 8 169 163 179 2 430 1 14 141 156 152 3 245 2 6 144 129 146 4 1431 3 11 120 127 127 5 1587 4 28 88 102 106 # ⦠with 6 more variables: diastolic_lying <dbl>, # diastolic_standing_1 <dbl>, diastolic_standing_3 <dbl>, # pulse_lying <dbl>, pulse_lying_1 <dbl>, pulse_lying_3 <dbl>
4 Réponses :
Cela peut être fait avec tidyverse
, mais c'est à mon humble avis beaucoup plus facile avec le bon vieux base::reshape
:
v <- list(c("diastolic_lying", "diastolic_standing_1", "diastolic_standing_3"), c("pulse_lying", "pulse_lying_1", "pulse_lying_3"), c("systolic_lying", "systolic_standing_1", "systolic_standing_3")) reshape(as.data.frame(bp), v, direction = "long", v.names = c("diastolic", "pulse", "systolic"), times = c("lying", "standing_1", "standing_3"), idvar = "ID", timevar = "type") %>% as_tibble() # A tibble: 15 x 7 # ID group measure_1 type diastolic pulse systolic # <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> # 1 1138 1 8 lying 80 58 169 # 2 430 1 14 lying 93 71 141 # 3 245 2 6 lying 80 58 144 # 4 1431 3 11 lying 71 63 120 # 5 1587 4 28 lying 66 98 88 # 6 1138 1 8 standing_1 87 62 163 # 7 430 1 14 standing_1 97 93 156 # 8 245 2 6 standing_1 79 61 129 # 9 1431 3 11 standing_1 77 70 127 # 10 1587 4 28 standing_1 75 73 102 # 11 1138 1 8 standing_3 92 67 179 # 12 430 1 14 standing_3 100 97 152 # 13 245 2 6 standing_3 83 63 146 # 14 1431 3 11 standing_3 79 71 127 # 15 1587 4 28 standing_3 77 76 106
Avec tidyverse
, ce n'est pas si difficile à réaliser, et cela ne dépendra pas des paramètres, donc lorsque les données changent (mesures supplémentaires), le code continuera à fonctionner.
# A tibble: 15 x 7 # Groups: ID, group, measure_1, posture [15] ID group measure_1 posture diastolic pulse systolic <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> 1 245 2 6 lying 80 58 144 2 430 1 14 lying 93 71 141 3 1138 1 8 lying 80 58 169 4 1431 3 11 lying 71 63 120 5 1587 4 28 lying 66 98 88 6 245 2 6 standing_1 79 61 129 7 430 1 14 standing_1 97 93 156 8 1138 1 8 standing_1 87 62 163 9 1431 3 11 standing_1 77 70 127 10 1587 4 28 standing_1 75 73 102 11 245 2 6 standing_3 83 63 146 12 430 1 14 standing_3 100 97 152 13 1138 1 8 standing_3 92 67 179 14 1431 3 11 standing_3 79 71 127 15 1587 4 28 standing_3 77 76 106
EDIT: Ma solution originale utilisait left_join à mauvais escient, faisant de nombreuses copies des données. Corrigé ci-dessous.
Je pense que c'est le résultat que vous recherchez, où nous voyons les trois postures et la valeur de chacune d'elles.
Dans ce cas, j'utilise bind_cols
pour combiner les trois paires clé-valeur dans le format que vous avez décrit.
select(bp, ID:measure_1, systolic_lying:systolic_standing_3) %>% gather("systolic_posture", "systolic", -c(ID:measure_1)) %>% bind_cols(select(bp, ID:measure_1, diastolic_lying:diastolic_standing_3) %>% gather("diastolic_posture", "diastolic", -c(ID:measure_1)) %>% select(-c(ID:measure_1))) %>% bind_cols(select(bp, ID:measure_1, pulse_lying:pulse_lying_3) %>% gather("pulse_posture", "pulse", -c(ID:measure_1)) %>% select(-c(ID:measure_1))) # A tibble: 15 x 9 ID group measure_1 systolic_posture systolic diastolic_posture diastolic pulse_posture pulse <dbl> <dbl> <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> 1 1138 1 8 systolic_lying 169 diastolic_lying 80 pulse_lying 58 2 430 1 14 systolic_lying 141 diastolic_lying 93 pulse_lying 71 3 245 2 6 systolic_lying 144 diastolic_lying 80 pulse_lying 58 4 1431 3 11 systolic_lying 120 diastolic_lying 71 pulse_lying 63 5 1587 4 28 systolic_lying 88 diastolic_lying 66 pulse_lying 98 6 1138 1 8 systolic_standing_1 163 diastolic_standing_1 87 pulse_lying_1 62 7 430 1 14 systolic_standing_1 156 diastolic_standing_1 97 pulse_lying_1 93 8 245 2 6 systolic_standing_1 129 diastolic_standing_1 79 pulse_lying_1 61 9 1431 3 11 systolic_standing_1 127 diastolic_standing_1 77 pulse_lying_1 70 10 1587 4 28 systolic_standing_1 102 diastolic_standing_1 75 pulse_lying_1 73 11 1138 1 8 systolic_standing_3 179 diastolic_standing_3 92 pulse_lying_3 67 12 430 1 14 systolic_standing_3 152 diastolic_standing_3 100 pulse_lying_3 97 13 245 2 6 systolic_standing_3 146 diastolic_standing_3 83 pulse_lying_3 63 14 1431 3 11 systolic_standing_3 127 diastolic_standing_3 79 pulse_lying_3 71 15 1587 4 28 systolic_standing_3 106 diastolic_standing_3 77 pulse_lying_3 76
avec tidyr 1.0.0 vous pouvez faire ce qui suit:
library(tidyr) pivot_longer(bp, -(1:3),names_to = c(".value","posture"), names_pattern="([^_]+)_(.+)") #> # A tibble: 25 x 7 #> ID group measure_1 posture systolic diastolic pulse #> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> #> 1 1138 1 8 lying 169 80 58 #> 2 1138 1 8 standing_1 163 87 NA #> 3 1138 1 8 standing_3 179 92 NA #> 4 1138 1 8 lying_1 NA NA 62 #> 5 1138 1 8 lying_3 NA NA 67 #> 6 430 1 14 lying 141 93 71 #> 7 430 1 14 standing_1 156 97 NA #> 8 430 1 14 standing_3 152 100 NA #> 9 430 1 14 lying_1 NA NA 93 #> 10 430 1 14 lying_3 NA NA 97 #> # ... with 15 more rows