web-dev-qa-db-fra.com

Comment concaténer deux chaînes?

Comment concaténer (fusionner, combiner) deux valeurs? Par exemple j'ai:

tmp = cbind("GAD", "AB")
tmp
#      [,1]  [,2]
# [1,] "GAD" "AB"

Mon but est de concaténer les deux valeurs de "tmp" en une chaîne:

tmp_new = "GAD,AB"

Quelle fonction peut faire cela pour moi?

350
Hans
paste()

est le chemin à parcourir. Comme les précédentes affiches l'ont souligné, paste peut faire deux choses:

concaténer des valeurs dans une "chaîne", par ex.

> paste("Hello", "world", sep=" ")
[1] "Hello world"

où l'argument sep spécifie le ou les caractères à utiliser entre les arguments à concaténer ou réduire les vecteurs de caractères

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"

où l'argument collapse spécifie le ou les caractère (s) à utiliser entre les éléments du vecteur à réduire.

Vous pouvez même combiner les deux:

> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"

J'espère que cela t'aides.

466
Rainer

help.search() est une fonction pratique, par ex.

> help.search("concatenate")

vous mènera à paste().

81
rtelmore

Pour la première réponse non -paste(), nous pouvons regarder stringr::str_c() (puis toString() ci-dessous). Cela n’a pas été aussi long 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.

tmp <- cbind("GAD", "AB")
library(stringr)
str_c(tmp, collapse = ",")
# [1] "GAD,AB"

De par sa description du fichier de documentation, il s’accorde parfaitement à ce problème.

Pour comprendre le fonctionnement de str_c, vous devez imaginer que vous construisez une matrice de chaînes. Chaque argument en entrée forme une colonne et est étendu à la longueur du plus long argument, en utilisant les règles de recyclage habituelles. La chaîne sep est insérée entre chaque colonne. Si collapse est NULL, chaque ligne est réduite en une seule chaîne. Si non-NULL, cette chaîne est insérée à la fin de chaque ligne et toute la matrice est réduite à une seule chaîne.

Ajouté le 13/04/2016: Ce n'est pas exactement la même chose que votre sortie souhaitée (espace supplémentaire), mais personne ne l'a mentionné non plus. toString() est fondamentalement une version de paste() avec collapse = ", " codé en dur, ce qui vous permet de faire

toString(tmp)
# [1] "GAD, AB"
41
Rich Scriven

Comme d'autres l'ont fait remarquer, paste() est la voie à suivre. Mais il peut être pénible de devoir taper paste(str1, str2, str3, sep='') à chaque fois que vous souhaitez utiliser le séparateur autre que celui par défaut.

Vous pouvez très facilement créer des fonctions d’emballage qui simplifient la vie beaucoup plus facilement. Par exemple, si vous concaténez très souvent des chaînes sans séparateur, vous pouvez effectuer les opérations suivantes:

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}

ou si vous voulez souvent joindre des chaînes à partir d'un vecteur (comme implode() depuis PHP):

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}

Vous permet de faire ceci:

p('a', 'b', 'c')
#[1] "abc"
vec <- c('a', 'b', 'c')
implode(vec)
#[1] "abc"
implode(vec, sep=', ')
#[1] "a, b, c"

De plus, il y a le paste0 intégré, qui fait la même chose que mon implode, mais sans autoriser de séparateurs personnalisés. C'est légèrement plus efficace que paste().

33
naught101
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

J'ai trouvé cela sur Google en cherchant R concaténer des chaînes : http://stat.ethz.ch/R-manual/R- patché/bibliothèque/base/html/paste.html

30
Ville Salonen

Sinon, si votre objectif est de produire directement dans un fichier ou une sortie standard, vous pouvez utiliser cat:

cat(s1, s2, sep=", ")
28
Megatron

Autrement:

sprintf("%s you can add other static strings here %s",string1,string2)

C'est parfois utile que la fonction paste(). %s désigne l'endroit où les chaînes subjectives seront incluses.

Notez que cela vous sera utile si vous essayez de créer un chemin:

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))

sortie

/this/is/a/path
18
Suat Atan PhD

Vous pouvez créer votre propre opérateur:

'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`

Vous pouvez également redéfinir les opérateurs 'et' (&):

'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"

déranger avec la syntaxe de base est moche, mais il en va de même avec paste()/paste0() si vous travaillez uniquement avec votre propre code, vous pouvez (presque toujours) remplacer l'opérateur logique & and par * et multiplier les valeurs logiques au lieu d'utiliser 'et &' logiques.

18
Qbik

Étant donné la matrice, tmp, que vous avez créée:

paste(tmp[1,], collapse = ",")

Je suppose qu'il y a une raison pour laquelle vous créez une matrice en utilisant cbind, par opposition à simplement:

tmp <- "GAD,AB"
14
neilfws

Considérons le cas où les chaînes sont des colonnes et le résultat devrait être une nouvelle colonne:

df <- data.frame(a = letters[1:5], b = LETTERS[1:5], c = 1:5)

df$new_col <- do.call(paste, c(df[c("a", "b")], sep = ", ")) 
df
#  a b c new_col
#1 a A 1    a, A
#2 b B 2    b, B
#3 c C 3    c, C
#4 d D 4    d, D
#5 e E 5    e, E

Si vous le souhaitez, ignorez la sous-définition [c("a", "b")] si toutes les colonnes doivent être collées.

# you can also try str_c from stringr package as mentioned by other users too!
do.call(str_c, c(df[c("a", "b")], sep = ", ")) 
2
joel.wilson

Une autre réponse non collée:

x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"

 data <- c("GAD", "AB")
1
sindri_baldur

glue est une nouvelle fonction, classe de données et package qui a été développé dans le cadre de tidyverse, avec de nombreuses fonctionnalités étendues. Il combine des fonctionnalités de coller, sprintf et les autres réponses précédentes.

tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB

Créé le 2019-03-06 par le paquetage reprex (v0.2.1)

Oui, c’est exagéré pour l’exemple simple de cette question, mais puissant dans de nombreuses situations. (voir https://glue.tidyverse.org/ )

Exemple rapide comparé à paste avec with ci-dessous. Le code glue était un peu plus facile à taper et un peu plus facile à lire.

tmp <- tibble::tibble(firststring = c("GAD", "GAD2", "GAD3"), secondstring = c("AB1", "AB2", "AB3"))
(tmp_new <- glue::glue_data(tmp, "{firststring} and {secondstring} went to the park for a walk. {firststring} forgot his keys."))
#> GAD and AB1 went to the park for a walk. GAD forgot his keys.
#> GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys.
#> GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys.
(with(tmp, paste(firststring, "and", secondstring, "went to the park for a walk.", firststring, "forgot his keys.")))
#> [1] "GAD and AB1 went to the park for a walk. GAD forgot his keys."  
#> [2] "GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys."
#> [3] "GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys."

Créé le 2019-03-06 par le paquetage reprex (v0.2.1)

1
Arthur Yip