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. 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 Réponses :
Utilisation de la base R Nous pouvons appliquer Commander Code> sur des colonnes sélectionnées dans
Tri code> à l'aide de
do.call code>. Nous utilisons
labayly code> pour obtenir la liste de DataFrames
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 code> dans ma réponse, mais pour rester restant d'entre eux, vous pouvez faire
packagename :: nominame code> pour utiliser ce paquet explicitement. Par exemple,
Purrr :: Plan Code>
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]),]) code>.
DT2 [[1]] CODE> et
DT [[2]] CODE> 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 code> en boucle ici. Si vous utilisez ma solution tel qu'il est, vous remarquerez que
dt2 [[1]] code> est un fichier de données trié par
Tri [[1]] code> et
DT2 [[2]] code> est un autre Dataframe trié par le tri
[[2]] code> 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 code> boucle pour appliquer cette solution. Si vous appliquez la solution
la solution code> dans un
pour code> boucle, vous aurez de mauvais résultats. Pouvez-vous simplement faire
dt2 <- labraque (tri de la fonction (x) dt [do.call (commande, dt [x]),]) code>?
(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.
A dplyr code> +
Purrr code> solution
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 code> au lieu de
mappe code>.
Voici une méthode avec ou utilisez SetOrdon code> à partir de
data.Table code>
arrangé_at code > à partir de
dplyr code> (sans utiliser la voie d'évaluation) p>
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%>% Code> Pour trier le problème
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]])]),] }
Le code d'échantillon que vous donnez n'est pas un code R valide. Par exemple,
Tri <- (Sort1, Sort2) Code> lancera une erreur. Idem pour
pour (i = 1: 2) code>. 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 a>.
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?" I> Just Prefix avec
Purrr :: Carte Code>.