1
votes

Réorganiser les lignes dans les boucles de table

Je voudrais changer l'ordre des lignes dans chaque table de sortie dans une boucle.

J'utilise actuellement lapply avec dcast pour obtenir un ensemble de tables, et j'ai essayé de configurer l'ordre souhaité dans une liste, puis d'implémenter le nouveau commander dans la liste avec match().

Voici ce que j'essaye:

#Reorder col1 names as desired

target <- c("Datsun 710", "Duster 360", "Hornet Sportabout", "Mazda RX4" , "Mazda RX4 Wag" , 
            "Merc 230", "Merc 240D", "Merc 280",  "Valiant", "Hornet 4 Drive")

table2 <- lapply(table1, FUN = function(x) 
          x[match(target, x$model), ])

table2

               model  class 1975 1983
1         Datsun 710     2    2    0
3         Duster 360     2    2    0
7  Hornet Sportabout     3    2    0
9          Mazda RX4     2    2    0
11     Mazda RX4 Wag     2    0    2
13          Merc 230     3    2    0
15         Merc 240D     2    0    2
17          Merc 280     3    0    2
19           Valiant     2    0    2
5     Hornet 4 Drive     3    0    2

Cependant, j'aimerais pour avoir le modèle "Hornet 4 Drive" à la fin du tableau comme ceci:

              model  class  1975 1983
1         Datsun 710     2    2    0
2         Datsun 710     4    1    0
3         Duster 360     2    2    0
4         Duster 360     4    1    0
7  Hornet Sportabout     3    2    0
8  Hornet Sportabout     4    1    0
9          Mazda RX4     2    2    0
10         Mazda RX4     3    1    0
11     Mazda RX4 Wag     2    0    2
12     Mazda RX4 Wag     4    0    1
13          Merc 230     3    2    0
14          Merc 230     4    1    0
15         Merc 240D     2    0    2
16         Merc 240D     4    0    1
17          Merc 280     3    0    2
18          Merc 280     4    0    1
19           Valiant     2    0    2
20           Valiant     3    0    1
5     Hornet 4 Drive     3    0    2
6     Hornet 4 Drive     4    0    1

Ce que j'essaye actuellement est:

#Setup data
mtcars1 <- head(mtcars, 10)
mtcars1$model <- rownames(mtcars1)
df <- dplyr::bind_rows(mtcars1, mtcars1, mtcars1)
df$year <- c(1975, 1983)
df$class <- c(2,2,2,3,3,3,4,4,4,4,2,2,2,3,3)

#Create set of tables
tables <- lapply(split(df, df$cyl), 
                 FUN = function(d) reshape2::dcast(model + class ~ year, 
                                                   value.var = "year", length , data = df))

tables

#My output has the rows arranged according to model alphabetical order, like this:

              model  class  1975 1983
1         Datsun 710     2    2    0
2         Datsun 710     4    1    0
3         Duster 360     2    2    0
4         Duster 360     4    1    0
5     Hornet 4 Drive     3    0    2
6     Hornet 4 Drive     4    0    1
7  Hornet Sportabout     3    2    0
8  Hornet Sportabout     4    1    0
9          Mazda RX4     2    2    0
10         Mazda RX4     3    1    0
11     Mazda RX4 Wag     2    0    2
12     Mazda RX4 Wag     4    0    1
13          Merc 230     3    2    0
14          Merc 230     4    1    0
15         Merc 240D     2    0    2
16         Merc 240D     4    0    1
17          Merc 280     3    0    2
18          Merc 280     4    0    1
19           Valiant     2    0    2
20           Valiant     3    0    1

r

1 commentaires

Veuillez écrire tous les packages que vous utilisez. Cela accélère l'exécution de votre code.


3 Réponses :


1
votes

Si je comprends bien, toute la question qui se pose est que vous "aimeriez avoir le modèle" Hornet 4 Drive "au bout du tableau". Voici un exemple de la façon dont vous pouvez faire cela:

df <- data.frame(num= 1:8, name= c("a", "a", "b", "b", "b", "c", "c", "d"), stringsAsFactors = FALSE)

name_last <- "b"

df <- rbind.data.frame(df[df$name != name_last, ], df[df$name == name_last, ])

df
  num name
1   1    a
2   2    a
6   6    c
7   7    c
8   8    d
3   3    b
4   4    b
5   5    b


0 commentaires

0
votes

Ceci devrait être ce que vous recherchez:

tables_reordered<-lapply(tables, function (x) {rbind(x[which(!x$model=="Hornet 4 Drive"),], x[which(x$model=="Hornet 4 Drive"),])})


0 commentaires

1
votes

Alternativement, cela peut être résolu en forçant le model à factoriser, en réorganisant les niveaux de facteur en utilisant forcats :: fct_relevel () , et en triant par niveaux de facteur.

$`4`
               model class 1975 1983
1         Datsun 710     2    2    0
2         Datsun 710     4    1    0
3         Duster 360     2    2    0
4         Duster 360     4    1    0
7  Hornet Sportabout     3    2    0
8  Hornet Sportabout     4    1    0
9          Mazda RX4     2    2    0
10         Mazda RX4     3    1    0
11     Mazda RX4 Wag     2    0    2
12     Mazda RX4 Wag     4    0    1
13          Merc 230     3    2    0
14          Merc 230     4    1    0
15         Merc 240D     2    0    2
16         Merc 240D     4    0    1
17          Merc 280     3    0    2
18          Merc 280     4    0    1
19           Valiant     2    0    2
20           Valiant     3    0    1
5     Hornet 4 Drive     3    0    2
6     Hornet 4 Drive     4    0    1

$`6`
               model class 1975 1983
1         Datsun 710     2    2    0
2         Datsun 710     4    1    0
3         Duster 360     2    2    0
4         Duster 360     4    1    0
7  Hornet Sportabout     3    2    0
8  Hornet Sportabout     4    1    0
9          Mazda RX4     2    2    0
10         Mazda RX4     3    1    0
11     Mazda RX4 Wag     2    0    2
12     Mazda RX4 Wag     4    0    1
13          Merc 230     3    2    0
14          Merc 230     4    1    0
15         Merc 240D     2    0    2
16         Merc 240D     4    0    1
17          Merc 280     3    0    2
18          Merc 280     4    0    1
19           Valiant     2    0    2
20           Valiant     3    0    1
5     Hornet 4 Drive     3    0    2
6     Hornet 4 Drive     4    0    1

$`8`
               model class 1975 1983
1         Datsun 710     2    2    0
2         Datsun 710     4    1    0
3         Duster 360     2    2    0
4         Duster 360     4    1    0
7  Hornet Sportabout     3    2    0
8  Hornet Sportabout     4    1    0
9          Mazda RX4     2    2    0
10         Mazda RX4     3    1    0
11     Mazda RX4 Wag     2    0    2
12     Mazda RX4 Wag     4    0    1
13          Merc 230     3    2    0
14          Merc 230     4    1    0
15         Merc 240D     2    0    2
16         Merc 240D     4    0    1
17          Merc 280     3    0    2
18          Merc 280     4    0    1
19           Valiant     2    0    2
20           Valiant     3    0    1
5     Hornet 4 Drive     3    0    2
6     Hornet 4 Drive     4    0    1
lapply(tables, function(x) {
  x[order(forcats::fct_relevel(x$model, "Hornet 4 Drive", after = Inf)), ]
})


0 commentaires