Comment changerait-on cette entrée (avec la séquence: heure, entrée, sortie, fichiers):
Time In Out Files
1 2 3 4
2 3 4 5
Vers cette sortie (avec la séquence: time, out, in, files)?
Time Out In Files
1 3 2 4
2 4 3 5
Voici les données factices R:
table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
## Time In Out Files
##1 1 2 3 4
##2 2 3 4 5
help(Extract)
également connu sous le nom de?'['
Réponses:
Votre trame de données a quatre colonnes comme ça
df[,c(1,2,3,4)]
. Notez que la première virgule signifie conserver toutes les lignes, et le 1,2,3,4 fait référence aux colonnes.Pour changer l'ordre comme dans la question ci-dessus, faites
df2[,c(1,3,2,4)]
Si vous voulez sortir ce fichier en tant que csv, faites
write.csv(df2, file="somedf.csv")
la source
df[,c(1,3,2,4:ncol(df))]
lorsque vous ne savez pas combien de colonnes il y a.la source
data <- data[c(1,3,"Var1", 2)]
?c(1,3,"Var1", 2)
sera lu comme étantc("1","3","Var1", "2")
donné que les vecteurs peuvent contenir des données d'un seul type, donc les types sont promus au type le plus général présent. Parce qu'il n'y a pas de colonnes avec les noms de caractères "1", "3", etc., vous obtiendrez des "colonnes non définies".list(1,3,"Var1", 2)
conserve les valeurs sans promotion de type, mais vous ne pouvez pas utiliser unlist
dans le contexte ci-dessus.mtcars[c(1,3,2)]
ensemble fonctionne-t-il? Je m'attendais à une erreur liée à des dimensions incorrectes ou similaires ... N'est-ce pasmtcars[,c(1,3,2)]
?Vous pouvez également utiliser la fonction de sous-ensemble:
Vous devriez mieux utiliser l'opérateur [] comme dans les autres réponses, mais il peut être utile de savoir que vous pouvez effectuer un sous-ensemble et une opération de réorganisation de colonne dans une seule commande.
Mettre à jour:
Vous pouvez également utiliser la fonction select du package dplyr:
Je ne suis pas sûr de l'efficacité, mais grâce à la syntaxe de dplyr, cette solution devrait être plus flexible, surtout si vous avez beaucoup de colonnes. Par exemple, les éléments suivants réorganiseront les colonnes de l'ensemble de données mtcars dans l'ordre inverse:
Et ce qui suit ne réorganisera que certaines colonnes et en supprimera d'autres:
En savoir plus sur la syntaxe select de dplyr .
la source
subset()
, voir cette question .everything()
particulièrement génial;mtcars %>% select(wt, gear, everything())
Comme mentionné dans ce commentaire , les suggestions standard pour réorganiser les colonnes dans un
data.frame
sont généralement lourdes et sujettes aux erreurs, surtout si vous avez beaucoup de colonnes.Cette fonction permet de réorganiser les colonnes par position: spécifiez un nom de variable et la position souhaitée, et ne vous inquiétez pas pour les autres colonnes.
Maintenant, la demande du PO devient aussi simple que ceci:
Pour permuter
Time
etFiles
colonnes en plus, vous pouvez faire ceci:la source
Une
dplyr
solution (faisant partie de l'tidyverse
ensemble de packages) consiste à utiliserselect
:la source
select(iris, Species, everything())
. Notez également que les devis ne sont pas nécessaires.everything()
comme dans le commentaire dedplyr
'sgroup
réorganisera également les variables, alors faites attention lorsque vous les utilisez dans une chaîne.C'est peut-être une coïncidence si l'ordre des colonnes que vous souhaitez se trouve avoir des noms de colonnes dans l'ordre alphabétique décroissant. Puisque c'est le cas, vous pouvez simplement faire:
C'est ce que j'utilise lorsque j'ai de gros fichiers avec de nombreuses colonnes.
la source
!! WARNING !!
data.table
se transformeTARGET
en un vecteur int:TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
pour résoudre ce problème:TARGET <- as.data.frame(TARGET)
TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
Vous pouvez utiliser le package data.table :
Comment réorganiser les colonnes data.table (sans copier)
la source
Les trois réponses les mieux notées ont une faiblesse.
Si votre trame de données ressemble à ceci
alors c'est une mauvaise solution à utiliser
Il fait l'affaire, mais vous venez d'introduire une dépendance sur l'ordre des colonnes dans votre entrée.
Ce style de programmation fragile est à éviter.
La dénomination explicite des colonnes est une meilleure solution
De plus, si vous avez l'intention de réutiliser votre code dans un cadre plus général, vous pouvez simplement
ce qui est également très agréable car il isole complètement les littéraux. En revanche, si vous utilisez dplyr's
select
alors vous mettriez en place ceux qui liront votre code plus tard, vous y compris, pour un peu de tromperie. Les noms de colonne sont utilisés comme littéraux sans apparaître dans le code en tant que tels.
la source
dplyr
la version1.0.0
inclut larelocate()
fonction pour réorganiser facilement les colonnes:ou
la source
la source
setcolorder
.Le seul que j'ai vu bien fonctionner est d' ici .
Utilisez comme ceci:
Fonctionne comme un charme.
la source