如何连接两个字符串?

How can I concatenate (merge, combine) two values? For example I have:

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

My goal is to concatenate the two values in "tmp" to one string:

tmp_new = "GAD,AB"

Which function can do this for me?

转载于:https://stackoverflow.com/questions/7201341/how-can-two-strings-be-concatenated

csdnceshi76
斗士狗 what about the small answer i have posted? any suggestions to improve it?
3 年多之前 回复
csdnceshi65
larry*wei Most answers here break if the strings are vectors, as @RichardScriven's answer notes.
4 年多之前 回复

11个回答

paste()

is the way to go. As the previous posters pointed out, paste can do two things:

concatenate values into one "string", e.g.

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

where the argument sep specifies the character(s) to be used between the arguments to concatenate, or collapse character vectors

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

where the argument collapse specifies the character(s) to be used between the elements of the vector to be collapsed.

You can even combine both:

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

Hope this helps.

weixin_41568196
撒拉嘿哟木头 Yes, I should be complaining about R, not just paste :P . It's actually inconsistent across R - data.frame() doesn't let you do it if vectors aren't a multiple of each other. matrix() spits out warnings, but array() doesn't. Kind of annoying. Really, they should all spit out warnings unless some option is set...
6 年多之前 回复
csdnceshi54
hurriedly% I wouldn't consider it unusual by R's standards. Vector recycling is a common property of R functions. Keep in mind that 'blah' is a vector of length 1. The recycling property makes it easy to do something like paste0("blah", 1:3) to get "blah1" "blah2" "blah3".
6 年多之前 回复
weixin_41568196
撒拉嘿哟木头 no - your answer is correct (as are most of the other answers that say the same thing). I was just noting that paste's behaviour is unusual in its flexibility.
6 年多之前 回复
csdnceshi64
游.程 True - but can you provide an alternative approach which addresses the question?
6 年多之前 回复
weixin_41568196
撒拉嘿哟木头 Mixing up strings and vectors or vectors of different lengths is a bit too flexible in paste() for my liking. For instance, paste(c('a','b'),'blah', c(1,2,3)) results in "a blah 1" "b blah 2" "a blah 3". Basically, it creates a vector of strings the same length as the longest vector that's passed in, and loops the other vectors/strings to the same length. Plenty of room for accidental behaviour there.
6 年多之前 回复

As others have pointed out, paste() is the way to go. But it can get annoying to have to type paste(str1, str2, str3, sep='') everytime you want the non-default separator.

You can very easily create wrapper functions that make life much simpler. For instance, if you find yourself concatenating strings with no separator really often, you can do:

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

or if you often want to join strings from a vector (like implode() from PHP):

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

Allows you do do this:

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

Also, there is the built-in paste0, which does the same thing as my implode, but without allowing custom separators. It's slightly more efficient than paste().

For the first non-paste() answer, we can look at stringr::str_c() (and then toString() below). It hasn't been around as long as this question, so I think it's useful to mention that it also exists.

Very simple to use, as you can see.

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

From its documentation file description, it fits this problem nicely.

To understand how str_c works, you need to imagine that you are building up a matrix of strings. Each input argument forms a column, and is expanded to the length of the longest argument, using the usual recyling rules. The sep string is inserted between each column. If collapse is NULL each row is collapsed into a single string. If non-NULL that string is inserted at the end of each row, and the entire matrix collapsed to a single string.

Added 4/13/2016: It's not exactly the same as your desired output (extra space), but no one has mentioned it either. toString() is basically a version of paste() with collapse = ", " hard-coded, so you can do

toString(tmp)
# [1] "GAD, AB"
weixin_41568174
from.. Heh, this is the only answer that addresses the fact that tmp is a vector, and not just a bunch of values - paste doesn't do vectors. The other option is do.call(paste, as.list(tmp)).
4 年多之前 回复
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

I found this from Google by searching for R concatenate strings: http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html

Given the matrix, tmp, that you created:

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

I assume there is some reason why you're creating a matrix using cbind, as opposed to simply:

tmp <- "GAD,AB"

help.search() is a handy function, e.g.

> help.search("concatenate")

will lead you to paste().

Alternatively, if your objective is to output directly to a file or stdout, you can use cat:

cat(s1, s2, sep=", ")
csdnceshi78
程序go At the time I found it helpful to summarize multiple answers for myself. The objective was not to collect votes but to help others filter through the many offered solutions. Often that's what I'm looking for.
接近 4 年之前 回复
weixin_41568127
?yb? So what the point posting a paste answer 4 years later when there are about a dozen of paste answers already?
接近 4 年之前 回复

You can create you own operator :

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

You can also redefine 'and' (&) operator :

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

messing with baseline syntax is ugly, but so is using paste()/paste0() if you work only with your own code you can (almost always) replace logical & and operator with * and do multiplication of logical values instead of using logical 'and &'

csdnceshi73
喵-见缝插针 Scriven mayby I don't understand, but it seems straightforward, compare : paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4])) and as.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
4 年多之前 回复

Consider the case where the strings are columns and the result should be a new column:

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

Optionally, skip the [c("a", "b")] subsetting if all columns needs to be pasted.

# 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 = ", ")) 
csdnceshi71
Memor.の Ok but stringi, stringr libraries are faster.
3 年多之前 回复

Another way:

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

It sometimes useful than paste() function. %s denotes the place where the subjective strings will be included.

Note that this will come in handy as you try to build a path:

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

output

/this/is/a/path
csdnceshi50
三生石@ Much better imho. paste is not flexible enough if you want to append something to a string.
3 年多之前 回复
csdnceshi73
喵-见缝插针 for C programmers dealing with R, sprintf is familiar and useful for "concatenating two strings"
接近 4 年之前 回复
共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐