0
votes

Effondrement des niveaux de facteurs multiples de la variable de caractère (désordonné) dans R

J'ai du mal à réduire les niveaux de facteurs multiples dans trois niveaux de facteur d'une variable spécifique dans le studio R.

Mon point de départ est un datable.table code> avec 250 variables et environ 4 000 lignes. Pour une variable de facteur, je veux collabaser, il s'agit de 75 niveaux dans 3 niveaux. De plus, des 75 niveaux, 4 niveaux doivent être ignorés (ou définis sur NA avant), car ils incluent des informations controversées. Cette variable de facteur est basée sur les réponses d'enquête qui incluent également des réponses individuelles au format texte. Parfois, même la langue diffère. Donc, c'est un peu désordonné. P>

J'ai essayé d'effondrer ces 75 niveaux (ou 71 niveaux si des observations respectives définies sur NA avant) en 3 de 3 de deux manières différentes. Cependant, R renvoie toujours un code> au lieu d'un > code> dans la console et je ne peux pas continuer à effectuer d'autres commandes. Bien sûr, je peux arrêter cela en frappant ESC code> mais cela ne m'aident pas à recevoir le résultat souhaité. P>

Donc, cet exemple imaginaire doit montrer ce que j'ai essayé: p> 1) Utilisation des niveaux Niveaux CODE> et LISTE CODE> Fonctions P>

dt$x %>%
fct_collapse(No= c("I don't allow anything", "..."), 
Yes= c("Number of visitors ,annual sales, sales growth", "number of customers", "Net sales", "..."), 
Maybe=c("The CEO's approval is needed.", "To be discussed"))


0 commentaires

3 Réponses :


0
votes

dt $ x est un "facteur". Pour attribuer des valeurs différentes à une colonne de facteur, vous devez d'abord convertir des données en type "PRÉCORE" TYPE

class(dt$x) # should be factor
dt$x <- as.character(dt$x)
class(dt$x) # should be "character"  

# a list of collapsed Categories
toCollapseCategories <- list(
    "No"=c("I don't allow anything", "..."), 
    "Yes"= c("Number of visitors ,annual sales, sales growth, number of customers", "Net 
           sales", "..."), 
    "Maybe"=c("The CEO's approval is needed.", "To be discussed")
)

dt$x[dt$x %in% toCollapseCategories$No] <- "No"
dt$x[dt$x %in% toCollapseCategories$Yes] <- "Yes"
dt$x[dt$x %in% toCollapseCategories$Maybe] <- "Maybe"

# and then get a factor
dt$x <- as.factor(dt$x)
class(dt$x) # factor


1 commentaires

Merci pour cette idée, Marcelo. Je l'ai essayé et je semblais d'abord bien travailler, mais je me retrouve d'une manière ou d'une autre avec 7 niveaux au lieu de 3. Je suppose que l'un d'entre eux est le NAS et peut-être que les autres niveaux ont été en quelqueilles doublées? Quoi qu'il en soit, comme je viens de poster, un ami m'a réellement montré un moyen de surmonter mon défi.



0
votes

Un de mes amis a en fait fourni la réponse. Ce n'est rien à voir avec la structure de données.

Cela fait le travail: xxx

Je ne sais toujours pas pourquoi la première option que j'ai postée ci-dessus ne fonctionne pas si (Cela a parfaitement bien bien avec une autre variable).


1 commentaires

Notez que, si vous souhaitez exclure certains niveaux, vous devez définir ces observations sur NA avant de faire la variable un facteur (ou en faites un caractère, définissez des observations sur NA, puis en faites un facteur à nouveau). En faisant cela pendant que la variable est un facteur, ces niveaux seront toujours présents dans la nouvelle variable mais avec 0 observations.



0
votes

J'ai écrit une fonction xfactor code> sur Github pour aider exactement ce type de situation. Il permet de recoder les niveaux de facteur avec une correspondance des regex, afin de pouvoir travailler avec des données en désordre. Il vous permet également de déposer des niveaux de facteur avec une correspondance REGEX à l'aide de l'instruction "Exclure".

devtools::install_github("jwilliman/xfactor")
library(xfactor)

dt$x <- xfactor::xfactor(dt$x, levels = c(
  No = "don't|never",
  Yes = "sales|visitors|customers",
  Maybe = "approval|discuss"),
  exclude = "irrelevant", ignore.case = TRUE)
  )


3 commentaires

Merci beaucoup pour votre réponse Jwilliman. J'ai essayé juste de voir si cela fonctionne (j'ai déjà eu une solution en cours d'exécution que j'ai postée ci-dessus). 1) Il manque un support à la fin de votre code. Je reçois toujours l'erreur suivante lorsque vous essayez que les opérations de votre colis sont possibles uniquement pour les types numériques, logiques ou complexes ».


J'ai d'abord commis une erreur d'écrire no = "ne" "pas" | "Jamais", etc., donc ceux qui veulent utiliser cette solution doivent noter que cela doit être non = "ne pas | jamais", etc. Je pense que votre code, Jwilliman, ne fonctionne pas avec une contribution très similaire. Je reçois le message d'erreur d'erreur: Matchs multiples pour: 'Dans mes données Toutes les réponses possibles sont répertoriées les unes des autres dans la variable et 2 ou plus d'observations pourraient avoir 10 entrées similaires et ne diffèrent que par 1 entrée.


@Ilka merci d'avoir essayé. Le message d'erreur est de vous avertir qu'une seule entrée est appariée par plusieurs niveaux différents (par exemple. "Je n'ai pas de clients" serait assorti de "Non" et "Oui" dans l'exemple ci-dessus). Vous devriez modifier vos expressions surgènes pour éviter de multiples correspondances - mais oui, il semble que vos données puissent être mieux adaptées à des correspondances absolument comme avec fcct_collapse plutôt que des matchs flous plutôt que des correspondances floues à l'aide des expressions de regex.