C'est avant tout une question de commodité. J'ajoute souvent des guillemets et des virgules à la main pour créer une liste c () pour une autre fonction. Existe-t-il un moyen rapide et intelligent de les ajouter qui n'implique pas de recherche / remplacement difficile ou plusieurs opérations? Si j'ai plusieurs éléments séparés par un espace ou une tabulation, ou un élément par ligne, j'aimerais faire ce qui suit:
ABCD
ou
A
B
C
D
to:
temp <- c("A", "B", "C", "D")
Je peux les ajouter à la main , faites une recherche / remplacement pour l'espace blanc sur "," puis ajoutez le premier / dernier, mais c'est ennuyeux. Existe-t-il un moyen plus rapide?
3 Réponses :
Voici les options pour les fonctions de chaîne de base R et pour celles de stringr . Dans les deux cas, l'idée est de diviser le texte à chaque espace, puis de remplacer les limites des mots par un guillemet simple ( '). La raison de cela est de faire la différence avec les guillemets doubles ( ") qui commencent et finissent une chaîne, c'est-à-dire d'avoir des guillemets dans une chaîne. Vous devriez pouvoir faire la même chose en échappant double guillemets ( \\ "), mais je trouve que je les associe rarement correctement lorsque j'essaie de le faire, donc je ne l'ai pas testé. Ensuite, vous réduisez ce vecteur de chaînes par des virgules (peut également être une virgule suivie d'un espace).
Avec les fonctions de base:
txt %>%
str_split("\\s") %>%
`[[`(1) %>%
str_replace_all("\\b", "'") %>%
str_flatten(collapse = ",")
#> [1] "'A','B','C','D'"
Ou les tidyverse:
library(dplyr)
library(stringr)
txt <- "A B C D"
split_txt <- strsplit(txt, split = "\\s")[[1]]
quoted <- gsub("\\b", "'", split_txt)
paste(quoted, collapse = ",")
#> [1] "'A','B','C','D'"
La fonction scan est la base de toutes les fonctions read. * , mais elle sert également à exécuter la tâche que vous souhaitez exécuter. Il y a quelques années, un paramètre text a été ajouté afin que vous n'ayez plus besoin d'envelopper textConnection autour de "chaînes nues". Peut être utilisé avec n'importe quel délimiteur et le séparateur d'espaces par défaut gérera ce que vous demandez à être traité:
TEMP <- scan(text="A B C D", what="")
#-------------------
Read 4 items
> TEMP
[1] "A" "B" "C" "D"
> dput(TEMP)
c("A", "B", "C", "D")
Cela a résolu le problème de la copie de centaines de noms de colonnes à partir d'Excel et de renommer immédiatement un data.frame dans R (j'ai dû charger les données à partir d'un .dbf pour garder les 0 en tête, ce qui tronquait les noms de colonnes).
scan peut être une fonction très utile. C'est la base de read.table et de ses dérivés, mais parfois vous devez "rouler vos propres" fonctions d'entrée en utilisant un mélange de readLines , scan et gsub < / code> peut vous sortir de situations complexes que les fonctions read. * ne peuvent pas gérer.
Même si c'est un peu délicat, vous pouvez créer et utiliser plusieurs curseurs dans RStudio.
Plusieurs curseurs peuvent être créés de différentes manières:
Appuyez sur Ctrl + Alt + {Haut / Bas} pour créer un nouveau curseur dans la direction enfoncée,
Appuyez sur Ctrl + Alt + Maj + {Direction} pour déplacer un deuxième curseur dans le direction,
Utilisez Alt et faites glisser avec la souris pour créer une sélection rectangulaire,
Utilisez Alt + Maj et cliquez pour créer une sélection rectangulaire de la position actuelle du curseur à la position cliquée.
Essayez avec
dput (v1)En regardant cela un an plus tard, je me rends compte que la demande d '«ajouter des virgules» aurait dû être considérée comme une opportunité d'éducation. Il n'y a pas de virgule dans le résultat
tempci-dessus. Au contraire, les virgules sont ajoutées par la fonctionprintpour signifier que les valeurs sont considérées comme de type caractère.