data3=data.frame("School"=c(1,1,2,2,3,3,4,4), "Fund"=c(0,1,0,1,0,1,0,1), "Grade_5"=c(22,20,21,24,24,26,25,22), "Grade_6"=c(10,6,6,10,9,9,9,10), "Grade_7"=c(5,9,9,8,10,8,8,6))
3 Réponses :
Utilisation de dplyr
(et tidyr
):
library(dplyr) library(tidyr) data2 <- data1 %>% pivot_longer(-c(School, Fund)) %>% separate(name, into = c('Type', 'Class', 'Grade')) %>% extract(Grade, 'Grade', "([0-9]+)") data2 #> # A tibble: 144 x 6 #> School Fund Type Class Grade value #> <dbl> <dbl> <chr> <chr> <chr> <dbl> #> 1 1 0 Total A 5 22 #> 2 1 0 Group1 A 5 10 #> 3 1 0 Group2 A 5 5 #> 4 1 0 Total B 5 23 #> 5 1 0 Group1 B 5 8 #> 6 1 0 Group2 B 5 6 #> 7 1 0 Total A 6 18 #> 8 1 0 Group1 A 6 7 #> 9 1 0 Group2 A 6 5 #> 10 1 0 Total B 6 26 #> # ⦠with 134 more rows
Créé le 06/04/2020 par le package reprex (v0.3.0)
Merci beaucoup! si la note est supérieure à 1 chiffre, elle ne prend que le premier, comment puis-je lui permettre de prendre tous les chiffres?
sry à ce sujet, corrigé ( extrait (Grade, 'Grade', "([0-9] +)")
)
Merci encore! J'ai essayé de modifier votre code pour l'exemple mis à jour pour data3 où je souhaite mettre en œuvre votre approche dans un cas où je n'ai besoin que de faire cette transformation avec des colonnes avec le nom `` Grade '' mais je n'ai pas été capable de le faire avec succès.
Vous pouvez le faire directement avec pivot_longer
avec des expressions régulières dans names_pattern
.
tidyr::pivot_longer(data1, cols = -c(School, Fund), names_to = c('Type', 'Class', 'Grade'), names_pattern = '(.*?)_([A-Z])_Grade(\\d+)', values_to = 'Score') # A tibble: 144 x 6 # School Fund Type Class Grade Score # <dbl> <dbl> <chr> <chr> <chr> <dbl> # 1 1 0 Total A 5 22 # 2 1 0 Group1 A 5 10 # 3 1 0 Group2 A 5 5 # 4 1 0 Total B 5 23 # 5 1 0 Group1 B 5 8 # 6 1 0 Group2 B 5 6 # 7 1 0 Total A 6 18 # 8 1 0 Group1 A 6 7 # 9 1 0 Group2 A 6 5 #10 1 0 Total B 6 26 # ⦠with 134 more rows
Nous pouvons utiliser melt
de data.table
library(data.table) melt(setDT(data1), id.var = c('School', 'Fund'))[, c('Type', 'Class', 'Grade') := tstrsplit(variable, "_")][, Grade := sub('Grade', '', Grade)][, variable := NULL][] # School Fund value Type Class Grade # 1: 1 0 22 Total A 5 # 2: 1 1 20 Total A 5 # 3: 2 0 21 Total A 5 # 4: 2 1 24 Total A 5 # 5: 3 0 24 Total A 5 # --- #140: 2 1 10 Group2 B 7 #141: 3 0 8 Group2 B 7 #142: 3 1 6 Group2 B 7 #143: 4 0 10 Group2 B 7 #144: 4 1 6 Group2 B 7
@akrun je viens de vérifier et cela fonctionne parfaitement!