web-dev-qa-db-fra.com

Comment utiliser l'attribut row.names pour ordonner les lignes de mon dataframe dans R?

J'ai créé une forêt aléatoire et prédit les classes de mon ensemble de tests, qui vivent heureusement dans une trame de données:

 row.names class 
 564028 1 
 275747 1 
 601137 0 
 922930 1 
 481988 1 
...

L'attribut row.names m'indique quelle ligne est laquelle, avant de faire diverses opérations qui brouillaient l'ordre des lignes pendant le processus. Jusqu'ici tout va bien.

Maintenant, j'aimerais avoir une idée générale de l'exactitude de mes prédictions. Pour ce faire, je dois prendre cette base de données et la réorganiser par ordre croissant en fonction de l'attribut row.names. De cette façon, je peux comparer les observations rangées par rapport aux étiquettes que je connais déjà.

Pardonnez-moi de poser une question aussi fondamentale, mais pour ma vie, je ne trouve pas une bonne source d’information sur la manière de réaliser une tâche aussi triviale.

La documentation m'implore de:

utilisez attr(x, "row.names") si vous devez extraire un ensemble de noms de lignes dont la valeur est un nombre entier.

mais cela ne me laisse rien d'autre que NULL.

Ma question est la suivante: comment utiliser le row.names qui m'a suivi fidèlement dans les différentes incarnations de cadres de données tout au long de mon flux de travail? N'est-ce pas ce pour quoi il est là?

18
Matt O'Brien

Cela a fonctionné pour moi:

new_df <- df[ order(row.names(df)), ]
16
cburghard

Aucune des solutions ne fonctionnerait réellement. CA devrait etre: 

df[ order(as.numeric(row.names(df))),] #assumer le cadre de données s'appelle df

parce que rowname dans R est 'caractère', lorsque la partie as.numeric manque, il organise les données comme suit: 1, 10, 11 ... etc.

21
ToNoY

Pour être complet:

La réponse de @ BondedDust fonctionne parfaitement pour l'attribut rownames, mais votre exemple n'utilise pas cet attribut. Le résultat fourni dans votre question indique l'utilisation d'une colonne nommée "row.names", qui n'est pas la même chose (toutes répertoriées dans le commentaire de @ BondedDust). Here serait la réponse si vous souhaitez trier la colonne "row.names" dans l'exemple donné dans votre question (il existe une autre publication sur celle-ci, située ici ). Cette réponse suppose que vous utilisez un cadre de données nommé "df", avec une colonne nommée "row.names":

ordered.df <- df[order(df$row.names),]   #this orders the df by the "row.names" column

Vous pouvez également trier par la première colonne (même chose si vous utilisez encore votre exemple):

ordered.df <- df[order(df[,1]),]         #this orders the df by the first column

J'espère que c'est utile!

2
mfloren

Cela se fera presque automatiquement car la fonction "[" affichera dans l'ordre lexical tout vecteur pouvant être associé à rownames ():

df[ rownames(df) , ]

Vous avez peut-être pensé qu'il serait nécessaire d'utiliser:

df[ order(rownames(df)) , ]

Mais cela vous aurait donné un ordre de 1: 100 sur 1,10,100, 12,13, ..., 2,20,21, ..., parce que l'argument de "[" devient contraint au caractère.

1
42-

vous pouvez simplement trier votre df en utilisant ceci: 

df <- df[sort(rownames(df)),]

et ensuite faites ce que vous voulez!

0
Erfan Mahmoudinia

En supposant que votre cadre de données s'appelle 'df', vous pouvez créer un nouveau cadre de données ordonné 'ord.df' qui contiendra les noms de ligne de df ainsi que ses valeurs dans la ligne de code suivante:

>ord.df<-cbind(rownames(df)[order(rownames(df))], df[order(rownames(df)),])
0
new_df <- df[ order(row.names(df)), ]  

ou quelque chose de similaire ne fonctionnera pas. Après cette instruction, le new_df n'a plus de nom de fichier. Je suppose qu'une meilleure solution consiste à ajouter une colonne en tant que nom de fichier, en la triant et en la définissant comme nom

0
user9447252

Si vous n'avez qu'une seule colonne dans votre base de données, comme dans mon cas, vous devez ajouter drop = F:

df[ order(rownames(df)) , ,drop=F]
0
forever