J'ai un jeu de données qui ressemble à la première image et je veux qu'il ressemble à la deuxième image. Je peux pivoter_longer en fonction de l'âge ou de la vitesse, mais pas les deux à la fois le haut est original, le bas est ce vers quoi je veux pivoter

r
1
Ben 17 nov. 2020 à 22:20

1 réponse

Meilleure réponse

Nous pouvons utiliser pivot_longer avec names_sep

library(tidyr)
pivot_longer(df1, cols = -ID, names_sep="_", names_to = c(".value", "grp"))

-production

# A tibble: 8 x 4
#     ID grp     age speed
#  <int> <chr> <dbl> <dbl>
#1     1 t1       10   100
#2     1 t2       11   300
#3     2 t1       11   500
#4     2 t2       12   100
#5     3 t1       10   200
#6     3 t2       11   300
#7     4 t1       12   100
#8     4 t2       13   400

Si les noms de colonnes ont plusieurs _, alors nous pouvons utiliser un lookaround regex

names(df1) <- c("ID", "age_T1", "age_T2", "speed_total_T1", "speed_total_T2")
pivot_longer(df1, cols = -ID, names_sep="_(?=T)", names_to = c(".value", "grp"))

-production

# A tibble: 8 x 4
#     ID grp     age speed_total
#  <int> <chr> <dbl>       <dbl>
#1     1 T1       10         100
#2     1 T2       11         300
#3     2 T1       11         500
#4     2 T2       12         100
#5     3 T1       10         200
#6     3 T2       11         300
#7     4 T1       12         100
#8     4 T2       13         400

Les données

df1 <- structure(list(ID = 1:4, age_t1 = c(10, 11, 10, 12), age_t2 = c(11, 
12, 11, 13), speed_t1 = c(100, 500, 200, 100), speed_t2 = c(300, 
100, 300, 400)), class = "data.frame", row.names = c(NA, -4L))
0
akrun 17 nov. 2020 à 20:09