0
votes

Tri de lataframe par plusieurs colonnes via la liste des noms de colonnes

J'ai une boucle, où dans les différentes itérations, je veux trier le Dataframe à l'aide de différentes listes de colonnes. Je peux faire ce tri lorsque je coque les variables de tri. Cependant, je veux transmettre les noms de colonne à l'aide de la liste de variable. Je ne pouvais pas trouver une façon de faire cela. XXX PRE>

Qu'est-ce que je veux dire par trier par c ("Avar", "CVAR") est que les données doivent être triées par Avar en premier et (S'il y a deux valeurs d'avar qui sont les mêmes) alors par CVAR. En d'autres termes, la sortie du tri par ce vecteur ne doit être qu'un seul type de données (pas une liste). Même chose à propos du tri par C ("Avar", "Bvar"). Au-dessus "PS1" représente l'une des solutions proposées. Cela me donne DT2 [[1]] qui est une liste de deux dataframes. Ce n'est pas ce dont j'ai besoin. DT2 devrait être une liste de deux dataframes. DT2 [[1]] devrait être un fichier de données. P>

Je tiens également à souligner que j'ai besoin de ce tri pour se passer d'une boucle, pas en passant à la commande ("tri") à la commande. En d'autres termes, la première itération devrait trier la base de données par premier élément de la liste de tri, qui est le vecteur "trieur" de mon code. Dans une application réelle, les données de différentes itérations ne sont pas le même jeu de données. P>

après la première boucle, DT2 [[[1]] doit être trié comme suit: P>

avar  bvar  cvar
1     a     3
1     b     2
3     s     5
4     f     4    


4 commentaires

Le code d'échantillon que vous donnez n'est pas un code R valide. Par exemple, Tri <- (Sort1, Sort2) lancera une erreur. Idem pour pour (i = 1: 2) . Cela peut suggérer qu'il y a des problèmes plus profonds avec la syntaxe générale R. Peut-être avez-vous besoin de prendre un pas en arrière et de vous familiariser avec les bases de R d'abord; Vous pouvez trouver beaucoup de matériel gratuit sur le Web. Un bon point de départ pourrait être une introduction à r .


Merci. J'ai corrigé la syntaxe dans le poteau.


Merci. Corrigé cela aussi. Ceci est une version très simplifiée de 5000 Code ligne. désolé pour les fautes de frappe.


"EST-il un moyen de qualifier d'utiliser la fonction" carte "natif plutôt que la fonction de carte géospatiale?" Just Prefix avec Purrr :: Carte .


4 Réponses :


1
votes

Utilisation de la base R Nous pouvons appliquer Commander sur des colonnes sélectionnées dans Tri à l'aide de do.call . Nous utilisons labayly pour obtenir la liste de DataFrames xxx


9 commentaires

Merci. J'ai édité mon message d'origine (ajoutant les trois derniers paragraphes) sur la raison pour laquelle les solutions proposées ne fonctionnent pas.


@EDITH Je n'ai utilisé aucun mappe dans ma réponse, mais pour rester restant d'entre eux, vous pouvez faire packagename :: nominame pour utiliser ce paquet explicitement. Par exemple, Purrr :: Plan


Lorsque j'utilise votre solution (labraque (triant [[[1]], fonction (x) dt [do.call (commande, dt [x]),]), je reçois une sortie une liste: le premier élément est trié des données triés par avar, et le deuxième élément est trié par CVAR. Le deuxième paragraphe de mon poste édité explique ce que je veux arriver à la place.


@Edith I Obtenez la même sortie attendue que celle indiquée dans votre message. DT2 <- PApply (tri, fonction (x) dt [do.call (commande, dt [x]),]) . DT2 [[1]] et DT [[2]] sont les deux dataframes identiques comme indiqué.


Lorsque j'utilise notre solution, DT2 [[1]] est une liste de deux éléments - Date triée respectivement par Avar et CVAR. Je vais éditer le code pour montrer exactement comment j'ai ajouté cette ligne.


@Edith Vous n'avez pas besoin de pour en boucle ici. Si vous utilisez ma solution tel qu'il est, vous remarquerez que dt2 [[1]] est un fichier de données trié par Tri [[1]] et DT2 [[2]] est un autre Dataframe trié par le tri [[2]] et aussi loin que je peux dire après avoir lu votre poste qui est ce dont vous avez besoin.


Merci. Dans cet établissement simplifié, une commande pourrait donner le même résultat qu'une boucle, mais dans le code réel, le jeu de données dans chaque itération n'est pas le même jeu de données. Ce sont des jeux de données différents avec un nombre différent d'enregistrements et de colonnes. J'ai donc vraiment besoin d'une solution qui traverse une boucle. En outre, votre solution ne me donne pas de DT2 [[1]] en tant que Dataframe. Cela me donne DT2 [[1]] une liste de deux dataframes et DT2 [[2]] qui constitue également une liste de deux dataframes. Vous pouvez voir dans le code de la publication exactement comment je l'ai. S'il vous plaît n'hésitez pas à corriger si mal.


@Edith Comme je l'ai mentionné précédemment, vous n'avez pas besoin d'utiliser un pour boucle pour appliquer cette solution. Si vous appliquez la solution la solution dans un pour boucle, vous aurez de mauvais résultats. Pouvez-vous simplement faire dt2 <- labraque (tri de la fonction (x) dt [do.call (commande, dt [x]),]) ?


(1) Non, je ne peux pas. Je ne peux absolument pas le faire en dehors de la boucle. Dans la première itération de la boucle, DT compte 11 000 rangées et 23 colonnes. Dans la deuxième itération, il a 202 rangées et 22 colonnes. Même s'il a le même nom, ce n'est pas le même jeu de données. (2) Si je fais votre solution en dehors de la boucle, comme celui-ci: DT2 <- labraque (tri de la fonction (x) dt [do.call (commande, dt [x]),]), je reçois DT2 qui est une liste de 2 articles. Chaque élément est une liste de 2 dataframes. Donc, je reçois 4 dataframes. Ce n'est pas ce dont j'ai besoin. Je ne pense pas que cela soit spécifique à l'environnement non plus - mais heureux d'être prouvé faux.



1
votes

A dplyr + Purrr solution xxx


2 commentaires

Merci. J'ai édité mon message d'origine (ajoutant les trois derniers paragraphes) sur la raison pour laquelle les solutions proposées ne fonctionnent pas.


@Edit utilisation purrr :: map au lieu de mappe .



0
votes

Voici une méthode avec SetOrdon à partir de data.Table xxx


ou utilisez arrangé_at à partir de dplyr (sans utiliser la voie d'évaluation) xxx


4 commentaires

Bonjour merci. J'ai deux problèmes liés à cette solution:


Bonjour merci. J'ai deux problèmes liés à cette solution: (1) J'ai également des forfaits géospaciaux chargés (FIFITYSTATER, GEOFACET, MAPPROJ). Il ressemble donc à la fonction "carte" de ces packages "prend" sur la fonction carte native r. Je reçois un message d'erreur sur la déclaration "Carte", sauf si je décharge ces packages géospéciaux. Existe-t-il un moyen de qualifier de fonctionner de la carte natale plutôt que de ce qui se présente dans des outils géospaciaux.


Le problème (2) est plus directement lié à cette question. Quand je dis à trier par c ("Avar", "BVAR"), je ne veux pas deux sorties distinctes. Je souhaite que le fichier soit trié d'abord par Avar, puis (s'il y a deux valeurs ou plus d'avar qui sont identiques) par BVAR. Pour le moment, en utilisant cette solution proposée, je reçois la sortie une liste: le premier élément est trié par des données par a. et le deuxième élément est trié des données par b.


@EDITH UTILISATION Purrr :: Carte (Tri, ~ DT%>% Pour trier le problème



0
votes
The following solution works for me! Other proposed solutions I tried failed to sort by two variables in a given vector simultaneously.

DT <-data.frame(avar = c(1,4,3,1), bvar = c("a","f","s","b"), cvar = c(3,4,5,2))

sort1 <-c("avar", "cvar")
sort2 <-c("avar", "bvar")
sorting <-list(sort1,sort2)
DT2<-list()

for (i in 1:2) {
    #THE FOLLOWING SOLUTION WORKS!!!
    DT2[[i]] <- DT[do.call(order,DT[as.character(sorting[[i]])]),]       
}

0 commentaires