3 votes

réorganise les colonnes spécifiées dans un cadre de données en ordre croissant.

J'ai une petite question, comment puis-je réorganiser un cadre de données uniquement pour les noms de colonnes sélectionnés ? J'aurais besoin d'une solution universelle ici car je dois l'utiliser sur des quantités changeantes de colonnes V (à chaque fois avec des colonnes V >100).

Exemple :

Considérez que j'ai les données :

dkk <- structure(list(A = 2L, X = 3L, C = 4L, D = 5L, Z = 6L, V1 = 5L, 
                     V6 = 5L, V4 = 5L, V5 = 5L, V3 = 2L, V2 = 2L), .Names = c("X", 
                                                                              "B", "C", "D", "Z", "V1", "V6", "V4", "V5", "V3", "V2"), 
                class = "data.frame", row.names = c(NA, -1L)) 

# X B C D Z V1 V6 V4 V5 V3 V2
  2 3 4 5 6  5  5  5  5  2  2

Comment puis-je réorganiser les colonnes avec un V pour qu'elles soient dans un ordre croissant :

# X B C D Z V1 V2 V3 V4 V5 V6
  2 3 4 5 6  5  2  2  5  5  5

Merci beaucoup !

4voto

akrun Points 148302

Voici une option plus rapide avec setcolorder de data.table

library(data.table)
i1 <- grep("V\\d+", names(dkk), value = TRUE)
cbind(dkk[setdiff(names(dkk), i1)], setcolorder(dkk[i1], order(i1))[])
#  A B C D Z V1 V2 V3 V4 V5 V6
#1 2 3 4 5 6  5  2  2  5  5  5

Cela devient un peu plus compliqué lorsque les noms des 'V' sont mélangés avec d'autres colonnes, par exemple, supposons que nous changions les noms de colonnes en

set.seed(24)
names(dkk) <- sample(names(dkk))
dkk
#   D C V6 Z V4 V1 B V2 V3 A V5
#1 2 3  4 5  6  5 5  5  5 2  2

Maintenant, l'option est de créer un index numérique de ces colonnes avec 'V' ('i2'), extraire les noms ('i3') et assigner l'ordre des noms et des colonnes séparément.

i2 <- grep("^V\\d+", names(dkk))
i3 <- names(dkk)[i2]
names(dkk)[i2] <- sort(names(dkk)[i2])
dkk[i2] <- dkk[i2][order(i3)]

pour obtenir

dkk
#  D C V1 Z V2 V3 B V4 V5 A V6
#1 2 3  5 5  5  5 5  6  2 2  4

Mise à jour

Il y avait un problème dans la solution ci-dessus. Elle ne fait pas le sort Le système fonctionne correctement lorsque les noms de colonne sont supérieurs à 9, c'est-à-dire 'V10', 'V11', etc. Supposons que le nom de notre troisième colonne soit 'V100'.

colnames(dkk)[3] <- "V100"   
dkk
#  D C V100 Z V4 V1 B V2 V3 A V5
#1 2 3    4 5  6  5 5  5  5 2  2

i2 <- grep("^V\\d+", names(dkk))
i3 <- names(dkk)[i2]

Nous pouvons analyser la partie numérique avec parse_number pour aider à la commande

i4 <- readr::parse_number(i3)
names(dkk)[i2] <- i3[order(i4)]
dkk[i2] <- dkk[i2][order(i4)]
dkk
#  D C V1 Z V2 V3 B V4 V5 A V100
#1 2 3  5 5  5  5 5  6  2 2    4

données

dkk <- structure(list(A = 2L, B = 3L, C = 4L, D = 5L, E = 6L, V1 = 5L,
                 V6 = 5L, V4 = 5L, V5 = 5L, V3 = 2L, V2 = 2L), .Names = c("A",
                                                                          "B", "C", "D", "Z", "V1", "V6", "V4", "V5", "V3", "V2"),
            class = "data.frame", row.names = c(NA, -1L))

2voto

Pierre Lapointe Points 12056

Vous pouvez essayer avec order sur colnames :

dkk[,order(colnames(dkk))]

  A B C D E V1 V2 V3 V4 V5 V6
  2 3 4 5 6  5  2  2  5  5  5

EDIT Pour commander uniquement les colonnes qui contiennent "V". Note : J'ai inclus une colonne Z dans l'ensemble de données. En fait, je c les noms des colonnes qui n'ont pas besoin d'être triées vers les colonnes "V" qui sont triées.

dkk <- structure(list(A = 2L, B = 3L, C = 4L, D = 5L, E = 6L, V1 = 5L,
                     V6 = 5L, V4 = 5L, V5 = 5L, V3 = 2L, V2 = 2L), .Names = c("A",
                                                                              "B", "C", "D", "Z", "V1", "V6", "V4", "V5", "V3", "V2"),
                class = "data.frame", row.names = c(NA, -1L))

cols <- c(colnames(dkk)[!grepl("V",names(dkk))],
colnames(dkk)[grepl("V",names(dkk))][order(colnames(dkk)[grepl("V",names(dkk))])])

dkk[,cols]

  A B C D Z V1 V2 V3 V4 V5 V6
1 2 3 4 5 6  5  2  2  5  5  5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X