Comment puis-je concaténer (fusionner, combiner) deux valeurs? Par exemple, j'ai:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
Mon objectif est de concaténer les deux valeurs de "tmp" en une seule chaîne:
tmp_new = "GAD,AB"
Quelle fonction peut faire cela pour moi?
Réponses:
est la voie à suivre. Comme l'ont souligné les affiches précédentes, la pâte peut faire deux choses:
concaténer des valeurs en une "chaîne", par exemple
où l'argument
sep
spécifie le ou les caractères à utiliser entre les arguments pour concaténer ou réduire les vecteurs de caractèresoù l'argument
collapse
spécifie le ou les caractères à utiliser entre les éléments du vecteur à réduire.Vous pouvez même combiner les deux:
J'espère que cela t'aides.
la source
paste()
mon goût. Par exemple,paste(c('a','b'),'blah', c(1,2,3))
résulte en"a blah 1" "b blah 2" "a blah 3"
. Fondamentalement, il crée un vecteur de chaînes de la même longueur que le vecteur le plus long transmis et boucle les autres vecteurs / chaînes à la même longueur. Beaucoup de place pour un comportement accidentel là-bas.paste0("blah", 1:3)
obtenir"blah1" "blah2" "blah3"
.data.frame()
ne vous permet pas de le faire si les vecteurs ne sont pas multiples les uns des autres.matrix()
crache des avertissements, maisarray()
ne le fait pas. Un peu ennuyeux. Vraiment, ils devraient tous cracher des avertissements à moins qu'une option ne soit définie ...help.search()
est une fonction pratique, par exemplevous mènera à
paste()
.la source
Pour la première non-
paste()
réponse, nous pouvons regarderstringr::str_c()
(puistoString()
ci-dessous). Cela n'existe pas depuis aussi longtemps que cette question, donc je pense qu'il est utile de mentionner qu'elle existe aussi.Très simple à utiliser, comme vous pouvez le voir.
D'après sa description du fichier de documentation, il convient parfaitement à ce problème.
Ajouté le 13/04/2016 : Ce n'est pas exactement la même chose que la sortie souhaitée (espace supplémentaire), mais personne ne l'a mentionné non plus.
toString()
est essentiellement une versionpaste()
aveccollapse = ", "
codé en dur, vous pouvez donc fairela source
paste
ne fait pas de vecteurs. L'autre option estdo.call(paste, as.list(tmp))
.Comme d'autres l'ont souligné,
paste()
c'est la voie à suivre. Mais il peut être ennuyeux d'avoir à taper àpaste(str1, str2, str3, sep='')
chaque fois que vous voulez le séparateur non par défaut.Vous pouvez très facilement créer des fonctions wrapper qui vous simplifient la vie. Par exemple, si vous vous retrouvez à concaténer des chaînes sans séparateur très souvent, vous pouvez faire:
ou si vous voulez souvent joindre des chaînes à partir d'un vecteur (comme à
implode()
partir de PHP):Vous permet de faire ceci:
De plus, il y a le intégré
paste0
, qui fait la même chose que le mienimplode
, mais sans autoriser les séparateurs personnalisés. C'est un peu plus efficace quepaste()
.la source
J'ai trouvé cela sur Google en recherchant des chaînes de concaténation R : http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
la source
Alternativement, si votre objectif est de sortir directement vers un fichier ou une sortie standard, vous pouvez utiliser
cat
:la source
paste
réponse 4 ans plus tard alors qu'il y a déjà une dizaine depaste
réponses?Autrement:
Il est parfois utile que la
paste()
fonction.%s
indique l'endroit où les chaînes subjectives seront incluses.Notez que cela vous sera utile lorsque vous essayez de créer un chemin:
production
la source
paste
n'est pas assez flexible si vous voulez ajouter quelque chose à une chaîne.Vous pouvez créer votre propre opérateur:
Vous pouvez également redéfinir les
&
opérateurs 'et' ( ):jouer avec la syntaxe de base est moche, mais il en va de même
paste()/paste0()
si vous travaillez uniquement avec votre propre code, vous pouvez (presque toujours) remplacer l'& and
opérateur logique par*
et faire la multiplication des valeurs logiques au lieu d'utiliser les logiques 'et &'la source
paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))
etas.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
Compte tenu de la matrice, tmp, que vous avez créée:
Je suppose qu'il y a une raison pour laquelle vous créez une matrice à l'aide de cbind, par opposition à simplement:
la source
Considérez le cas où les chaînes sont des colonnes et le résultat doit être une nouvelle colonne:
Vous pouvez également ignorer le
[c("a", "b")]
sous-ensemble si toutes les colonnes doivent être collées.la source
stringi, stringr
bibliothèques sont plus rapides.Une autre réponse non collée:
Où
la source
glue
est une nouvelle fonction, classe de données et package qui a été développé dans le cadre de latidyverse
, avec de nombreuses fonctionnalités étendues. Il combine les fonctionnalités de paste, sprintf et les autres réponses précédentes.Créé le 2019-03-06 par le package reprex (v0.2.1)
Oui, c'est exagéré pour l'exemple simple de cette question, mais puissant pour de nombreuses situations. (voir https://glue.tidyverse.org/ )
Exemple rapide par rapport à
paste
avecwith
ci - dessous. Leglue
code était un peu plus facile à taper et semble un peu plus facile à lire.Créé le 2019-03-06 par le package reprex (v0.2.1)
la source