R et substitution

malavita
Modifié (July 2022) dans Statistiques
Bonjour à tous,
en ce début de vacances, à défaut de Sudoku, je m'amuse un peu avec le célèbre logiciel de statistiques R. J'ai un jeu de donné, disons jeu, pour lequel je trace le graphique relatif à un caractère, disons car.
Cela se fait via la commande:
 boxplot(jeu$var) 
Jusque ici tout va bien, imaginons maintenant que je veuille tracer plusieurs graphiques, jeu$var1, jeu$var2....Je crée, à l'aide d'une boucle, des variables
a1="jeu$var1",a2="jeu$var2"...
cependant R ne semble pas apprécier la commande
boxplot(a1)
Quelqu'un saurait il comment résoudre ce petit problème ?
A+
F.

Réponses

  • Math Coss
    Modifié (July 2022)
    Quel est le type de a1 ?
  • malavita
    Modifié (July 2022)
    Bonsoir,  $a1$ est une variable de type "character". J'ai finalement trouvé une solution, que je comprends vaguement : il faut créer une variable caractère contenant la commande en entier et la "parser" :
    cmd="boxplot(jeu$a1)"
    cmd_parse=parse(text=cmd)
    eval(cmd_parse)
    La variable cmd_parse est alors de type expression et peut être évalué. C'est un peu déroutant les types de variables dans R, par exemple un vecteur dont les composantes sont des nombres et un nombre sont tous deux de type "numeric"
    A+
    F.
  • Math Coss
    Modifié (July 2022)
    Il doit y avoir une façon de convertir la variable a1 en vecteur de nombres au lieu de vecteur de caractères ? Peut-être
  • log
    log
    Modifié (July 2022)
    Quand on écrit boxplot(jeu$\$$var), jeu$\$$var est le champ var dans la table jeu, ou bien l'élément var dans la liste jeu. boxplot est une fonction, et elle opère sur un un type d'objet précis - dans ce cas j'imagine que jeu$\$$var est une liste de données. Si on définit a1="jeu$\$$var1", alors a1 est une simple chaîne de caractères, ça n'appartient pas au domaine de def de la fonction.
    Il est possible de convertir une chaîne en la variable dont elle est le nom, en faisant get(a1) ici. Donc boxplot(get(a1)).
    Mais la manière plus propre je pense serait de faire un truc du genre (en supposant que jeu est une table/data frame, et qu'elle ne contient que les trucs à afficher)
    for (nmi in names(jeu)) {
      boxplot(jeu[, nmi])
    }

    si jeu est une liste, alors:
    for (nmi in names(jeu)) {
      boxplot(jeu[[nmi]])
    }
  • malavita
    Modifié (July 2022)
    Bonjour,
    merci de vos réponses. Une autre petite question, je dispose d'une matrice numérique et je désire sélectionner les lignes dont le premier terme est supérieur à 50. Cela se fait sans difficultés avec une boucle for. Cependant est-il possible d'obtenir le même résultat avec une instruction du genre:
    x["...."]
    Merci et bonne journée
    F.
  • log
    log
    Modifié (July 2022)
    En R il faut en principe toujours privilégier les opérations vectorielles plutôt que les boucles. Pour sélectionner dans une matrice m les rangs tels que une colonne col vérifie une condition particulière (que j'exprime sous la forme d'une fonction cond qui retourne un booléen), on peut faire : m[cond(m[, col]), ].
    cond(m[, col]) est un vecteur booléen correspondant au test de la condition cond sur la colonne col. Pour un vecteur vecteur_booleen m[vecteur_booleen, ] retourne les rangs de la matrice pour lesquels les valeurs du vecteur sont vraies.
    Donc, pour le cas particulier de la 1e colonne > 50, on ferait m[m[, 1] > 50, ]
  • malavita
    Modifié (July 2022)
    Ok, donc dans la commande m[args,], args peut être un vecteur de type numeric ou bien booleen. On aurait aussi pu utiliser m[which(m[, 1] > 50), ].
    Je viens d'ailleurs de me rendre compte d'un truc amusant, les éléments d'une matrice peuvent être indexé par 2 indices...ou 1 seul :#
    Merci de ta réponse.
    F.
    PS. Si par hasard tu connais quelques ressources disponibles sur le sujet... typiquement des fiches de TD, ça m'intéresse ;-)
Connectez-vous ou Inscrivez-vous pour répondre.