3 votes

Seules les chaînes de caractères peuvent être converties en symboles au sein d'une fonction dans R

J'ai une fonction qui est destinée à opérer sur des données obtenues à partir d'une variété de sources avec de nombreux champs de saisie manuelle. Comme je ne sais pas à quoi m'attendre en ce qui concerne la mise en page ou la convention d'appellation utilisée dans ces fichiers, je veux qu'elle "scanne" un cadre de données à la recherche de colonnes contenant la chaîne de caractères "fix", "name" ou "agent", et qu'elle transforme la colonne en une nouvelle colonne portant le nom "Firm", puis qu'elle procède à un nettoyage des chaînes de caractères sur les entrées de cette colonne, et enfin qu'elle supprime la colonne d'origine. J'ai réussi à le faire fonctionner avec CERTAINS des CSV que j'ai déjà, mais j'ai maintenant rencontré cette erreur : SEULES LES CHAÎNES PEUVENT ÊTRE CONVERTIES EN SYMBOLES. J'ai consulté ce fil de discussion ERREUR : Seules les chaînes de caractères peuvent être converties en symboles mais en vain.

Voici la fonction actuelle :

clean_firm_names2 <- function(df){
  df <- df %>%
    mutate(Firm := !!rlang::sym(grep(pattern = '(AGENT)|(NAME)|(FIX)',x = colnames(.), ignore.case = T, value = T)) %>% 
             str_replace_all(pattern = "(\\W)+"," ") %>% 
             ...str manipulations...
             str_squish()) %>%
    dplyr::select(-(!!rlang::sym(grep(pattern = '(AGENT)|(NAME)|(FIX)',x = colnames(.), ignore.case = T, value = T))))
  return(df)
}

J'ai essayé d'utiliser as.character() autour de la fonction grep() mais cela n'a pas résolu le problème. J'ai regardé le CSV sur lequel la fonction est censée opérer et tous les noms de colonnes sont des chaînes de caractères. J'ai lu le CSV en utilisant vroom() comme pour mes autres CSV, et cela fonctionne bien, tous les noms de colonnes apparaissent. Je peux effectuer d'autres dplyr sur le df, ce qui me laisse penser que le df se comporte normalement par ailleurs. Je suis à court d'idées pour expliquer pourquoi la fonction ne s'arrête que sur CERTAINS de mes CSV, alors qu'elle fonctionne comme prévu sur les autres. Quelqu'un a-t-il rencontré des problèmes similaires ou a-t-il des indices sur ce qui pourrait causer cette erreur ? C'est la première fois que j'utilise SO - je suis désolé si cette question n'est pas très claire. J'essaierai de la modifier si nécessaire.

Gracias.

1voto

Artem Points 738

Il convient de noter que grep() renvoie les indices des correspondances (nombres entiers), et non les correspondances elles-mêmes (chaînes de caractères). Indices entiers peut est transmise directement à dplyr::rename Il est donc possible que le texte suivant soit plus approprié.

i <- grep(pattern = '(AGENT)|(NAME)|(FIX)', x = colnames(df), ignore.case = T, value = T)
df <- df %>%
  rename(Firm = i) %>%
  mutate(Firm = ...str manipulations... )

(Il est implicitement supposé ici que votre grep() renvoie un unique index. Un code supplémentaire peut être nécessaire pour traiter les correspondances multiples).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X