Une question d'optimisation de code "juste par curiosité". Voici un exemple de dataframe :
Code : Tout sélectionner
dat <- structure(list(Ind = structure(1:6, .Label = c("C002", "C007",
"C009", "C010", "C013", "C016"), class = "factor"), Sex = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = "F", class = "factor"), DCOX_L = c(213L,
197L, 205L, 204L, 202L, 197L), DCOX_R = c(213L, 197L, 200L, 203L,
202L, 193L), IIMT_L = c(43L, 48L, 37L, 53L, 61L, 47L), IIMT_R = c(43L,
50L, 36L, 52L, 55L, 45L), ISMM_L = c(105L, 95L, 96L, 104L, 97L,
97L), ISMM_R = c(107L, 95L, 99L, 105L, 98L, 98L)), row.names = c(NA,
6L), class = "data.frame")
print(dat)
#> Ind Sex DCOX_L DCOX_R IIMT_L IIMT_R ISMM_L ISMM_R
#> 1 C002 F 213 213 43 43 105 107
#> 2 C007 F 197 197 48 50 95 95
#> 3 C009 F 205 200 37 36 96 99
#> 4 C010 F 204 203 53 52 104 105
#> 5 C013 F 202 202 61 55 97 98
#> 6 C016 F 197 193 47 45 97 98
En gros, j'ai donc un identifiant d'individu (Ind), puis quelques mesures osseuses (DCOX, IIMT, ISMM) qui sont prises des deux côtés du corps (Left, Right). Le but serait de pivoter ce dataframe le plus simplement possible pour obtenir ceci :
Code : Tout sélectionner
#> Ind Sex side DCOX IIMT ISMM
#> 1 C002 F L 213 43 105
#> 2 C002 F R 213 43 107
#> 3 C007 F L 197 48 95
#> 4 C007 F R 197 50 95
#> 5 C009 F L 205 37 96
#> 6 C009 F R 200 36 99
#> 7 C010 F L 204 53 104
#> 8 C010 F R 203 52 105
#> 9 C013 F L 202 61 97
#> 10 C013 F R 202 55 98
#> 11 C016 F L 197 47 97
#> 12 C016 F R 193 45 98
J'y parviens en utilisant successivement pivot_longer() puis pivot_wider(), de la manière suivante :
Code : Tout sélectionner
library(tidyverse)
dat |>
pivot_longer(cols = DCOX_L:ISMM_R, names_to = c("var", "side"), names_pattern = "([[:alnum:]]*)_([LR]*)") |>
pivot_wider(names_from = "var", values_from = "value")
Même si ça semble être une stratégie classique à en croire la doc de {tidyr}, je me demande confusément s'il n'y aurait pas moyen de faire ça encore plus simplement en n'utilisant que pivot_longer(). Verriez-vous une façon plus efficace/élégante de procéder que ce que j'ai fait ici ?
Merci !