提问



如何连接(合并,组合)两个值?
例如我有:


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


我的目标是将tmp中的两个值连接到一个字符串:


tmp_new = "GAD,AB"


哪个功能可以为我做这个?

最佳参考


paste()


是要走的路。正如之前的海报所指出的,粘贴可以做两件事:


将值连接成一个字符串,例如


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


其中参数sep指定要连接的参数之间使用的字符,
或折叠字符向量


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


其中参数collapse指定要折叠的矢量元素之间使用的字符。


你甚至可以结合两者:


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


希望这可以帮助。

其它参考1


help.search()是一个方便的功能,例如


> help.search("concatenate")


会引导你paste()

其它参考2


对于第一个非paste()答案,我们可以看一下stringr::str_c()(然后是toString())。它没有和这个问题一样长,所以我认为提及它也存在是有用的。


你可以看到,使用起来非常简单。


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


从它的文档文件描述,它很好地适应了这个问题。



  要了解str_c的工作原理,您需要想象您正在构建一个字符串矩阵。每个输入参数形成一个列,并使用通常的重新规划规则扩展到最长参数的长度。 sep字符串插入每列之间。如果collapse为NULL,则每行都会折叠为单个字符串。如果非NULL,则在每行的末尾插入该字符串,并将整个矩阵折叠为单个字符串。



已于2016年4月13日添加:它与您想要的输出(额外空间)不完全相同,但没有人提及它。toString()基本上是[[toString()的一个版本paste() collapse = ", "硬编码,所以你可以这样做


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

其它参考3


或者,如果您的目标是直接输出到文件或标准输出,您可以使用cat:


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

其它参考4


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


我是通过搜索 R连接字符串从Google找到的:http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html [50]]]

其它参考5


正如其他人所指出的,paste()是要走的路。但是每次你想要非默认分隔符时必须输入paste(str1, str2, str3, sep='')会很烦人。


您可以非常轻松地创建更简单的包装函数。例如,如果你发现自己经常连接没有分隔符的字符串,你可以这样做:


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


或者如果你经常想从一个向量中加入字符串(比如php中的implode()):


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


允许您这样做:


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


此外,内置paste0,它与我的implode做同样的事情,但不允许自定义分隔符。它比paste()略高效。

其它参考6


您可以创建自己的运算符:


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


您还可以重新定义和(&)运算符:


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


搞乱基线语法很难看,但如果你只使用自己的代码就可以使用paste()/paste0(),你可以(几乎总是)用*替换逻辑& and运算符并进行逻辑值的乘法运算而不是使用逻辑和&

其它参考7


给定您创建的矩阵tmp:


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


我假设你有一些理由为什么要用cbind创建一个矩阵,而不是简单地:


tmp <- "GAD,AB"

其它参考8


其他方式:


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


它有时比paste()函数有用。 %s表示将包含主观字符串的位置。


请注意,当您尝试构建路径时,这将派上用场:


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


产量


/this/is/a/path

其它参考9


考虑字符串是列并且结果应该是新列的情况:


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


(可选)如果需要粘贴所有列,请跳过[c("a", "b")]子集。


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

其它参考10


另一个非粘贴答案:


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


哪里


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