2011-08-26 23 views
277

Come posso unire/combinare due valori in R? Per esempio io ho:Come concatenare 2 stringhe?

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

Il mio obiettivo è quello di ottenere tmp come una stringa

tmp_new = "GAD,AB" 

Quale funzione può fare questo per me?

+0

La maggior parte delle risposte si interrompono se le stringhe sono vettori, come le note di risposta di @ RichardScriven. – smci

+0

@smci e la piccola risposta che ho postato? qualche suggerimento per migliorarlo? –

risposta

13

Data la matrice, tmp, che si è creato:

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

Presumo ci sia qualche ragione per cui stai creando una matrice usando cbind, al contrario di semplicemente:

tmp <- "GAD,AB" 
357
paste() 

è la strada da percorrere. Come indicato dai precedenti manifesti, pasta può fare due cose:

concatenare valori in una "stringa", ad es.

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

dove l'argomento sep specifica il carattere (s) da utilizzare tra gli argomenti per concatenare, o comprimere vettori carattere

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

dove l'argomento collapse specifica il carattere (s) di essere usato tra gli elementi del vettore per essere collassato.

È anche possibile combinare entrambe le cose:

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

Spero che questo aiuti.

+6

La combinazione di stringhe e vettori o vettori di lunghezze diverse è un po 'troppo flessibile in 'paste()' per i miei gusti. Ad esempio, "incolla (c ('a', 'b'), 'blah', c (1,2,3)) 'risulta in' "a blah 1" "b blah 2" "a blah 3" ' . Fondamentalmente, crea un vettore di stringhe della stessa lunghezza del vettore più lungo che viene passato, e loop gli altri vettori/stringhe alla stessa lunghezza. Lì c'è spazio per comportamenti accidentali. – naught101

+1

Vero - ma puoi fornire un approccio alternativo che indirizzi la domanda? – Rainer

+1

no - la tua risposta è corretta (come la maggior parte delle altre risposte che dicono la stessa cosa). Stavo solo notando che il comportamento di quella pasta è insolito nella sua flessibilità. – naught101

70

help.search() è una funzione utile, ad es.

> help.search("concatenate") 

ti condurrà a paste().

20

Come altri hanno sottolineato, paste() è la strada da percorrere. Ma può essere fastidioso dover digitare paste(str1, str2, str3, sep='') ogni volta che si desidera il separatore non predefinito.

È possibile creare facilmente funzioni di wrapper che lo rendono molto più semplice.Per esempio, se vi trovate concatenazione di stringhe senza separatore davvero spesso, si può fare:

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

o se si spesso desidera partecipare stringhe da un vettore (come implode() da php):

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

Consente fate fare questo:

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

Inoltre, v'è il costruito nel paste0, che fa la stessa cosa come la mia implode, ma senza allo separatori personalizzati di ali. È leggermente più efficiente di paste().

32

Per la prima risposta non- paste(), è possibile consultare stringr::str_c() (e quindi toString() di seguito). Non è stato intorno a questa domanda, quindi penso che sia utile menzionare che esiste anche.

Molto semplice da usare, come potete vedere.

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

Dalla descrizione del file di documentazione, si adatta bene a questo problema.

Per capire come funziona str_c, è necessario immaginare di creare una matrice di stringhe. Ogni argomento di input forma una colonna ed è esteso alla lunghezza dell'argomento più lungo, utilizzando le consuete regole di ricollocazione. La stringa sep è inserita tra ogni colonna. Se il collasso è NULL, ogni riga viene compressa in una singola stringa. Se non NULL quella stringa viene inserita alla fine di ogni riga e l'intera matrice viene compressa in una singola stringa.

Aggiunto 2016/04/13: Non è esattamente lo stesso che l'output desiderato (spazio), ma nessuno ha menzionato neanche. toString() è fondamentalmente una versione di paste() con collapse = ", " hard-coded, in modo da poter fare

toString(tmp) 
# [1] "GAD, AB" 
+3

Heh, questa è l'unica risposta che affronta il fatto che tmp è un vettore, e non solo un mucchio di valori - 'paste' non fa vettori . L'altra opzione è 'do.call (incolla, as.list (tmp))'. – naught101

22

In alternativa, se il vostro obiettivo è quello di uscita direttamente in un file o stdout, è possibile utilizzare cat:

cat(s1, s2, sep=", ") 
+4

Quindi, qual è il punto che invia una risposta "incolla" 4 anni più tardi, quando ci sono già una dozzina di risposte "incolla"? –

+3

All'epoca ho trovato utile riassumere più risposte per me stesso. L'obiettivo non era raccogliere voti ma aiutare gli altri a filtrare attraverso le tante soluzioni offerte. Spesso è quello che sto cercando. – Megatron

16

È possibile creare voi proprio operatore:

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

È inoltre possibile ridefinire 'e' (&) op erator:

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

scherzi con la sintassi di base è brutto, ma così sta usando paste()/paste0() se si lavora solo con il proprio codice è possibile (quasi sempre) sostituire logica & and all'operatore * e fare la moltiplicazione dei valori logici invece di usare logica 'e &'

+0

@Richard Scriven mayby ​​Non capisco, ma sembra semplice, confronta: 'paste0 (as.matrix (iris [1: 4]), as.matrix (iris [1: 4]))' e 'as. matrice (iris [1: 4])% e% as.matrix (iris [1: 4]) ' – Qbik

11

Un altro modo:

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

a volte utile di paste() funzione. %s indica il luogo in cui verranno incluse le stringhe soggettive.

Si noti che questo sarà utile come si tenta di costruire un percorso:

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

uscita

/this/is/a/path 
+0

per i programmatori C che si occupano di R, sprintf è familiare e utile per" concatenare due stringhe " – subsci

+0

Molto meglio imho. 'paste' non è abbastanza flessibile se vuoi aggiungere qualcosa a una stringa. – displayname

1

Si consideri il caso in cui le stringhe sono le colonne e il risultato dovrebbe essere una nuova colonna :

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 

Facoltativamente, saltare la [c("a", "b")] subsetting se tutti colum ns deve essere incollato.

# 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 = ", ")) 
+0

Ok ma le librerie 'stringi, stringr' sono più veloci. – smci

Problemi correlati