如何将两个字符串连接起来?

Han*_*ans 358 r string-concatenation r-faq

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

tmp = cbind("GAD", "AB")
tmp
#      [,1]  [,2]
# [1,] "GAD" "AB"
Run Code Online (Sandbox Code Playgroud)

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

tmp_new = "GAD,AB"
Run Code Online (Sandbox Code Playgroud)

哪个功能可以为我做到这一点?

Rai*_*ner 475

paste()
Run Code Online (Sandbox Code Playgroud)

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

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

> paste("Hello", "world", sep=" ")
[1] "Hello world"
Run Code Online (Sandbox Code Playgroud)

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

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"
Run Code Online (Sandbox Code Playgroud)

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

你甚至可以结合两者:

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

希望这可以帮助.

  • 混合字符串和向量或不同长度的向量在我的喜好`paste()`中有点过于灵活.例如,`paste(c('a','b'),'blah',c(1,2,3))`导致`"a blah 1""b blah 2""a blah 3" .基本上,它创建一个字符串向量,其长度与传入的最长向量相同,并将其他向量/字符串循环到相同的长度.那里有很多意外行为的空间. (9认同)
  • 是的,我应该抱怨R,而不仅仅是粘贴:P.它实际上与R不一致 - "data.frame()"如果向量不是彼此的倍数,则不允许你这样做.`matrix()`吐出警告,但`array()`没有.有点烦人.真的,他们都应该吐出警告,除非设定一些选项...... (5认同)
  • @ naught101 按照 R 的标准,我不会认为它不寻常。向量循环是 R 函数的一个共同属性。请记住,'blah' 是一个长度为 1 的向量。回收属性可以很容易地执行类似 `paste0("blah", 1:3)` 的操作来获得 `"blah1" "blah2" "blah3"`。 (2认同)

rte*_*ore 82

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

> help.search("concatenate")
Run Code Online (Sandbox Code Playgroud)

会带你去paste().


Ric*_*ven 42

对于第一个非paste()答案,我们可以查看stringr::str_c()(然后toString()在下面).只要这个问题没有出现,所以我认为提及它也存在是有用的.

您可以看到,使用非常简单.

tmp <- cbind("GAD", "AB")
library(stringr)
str_c(tmp, collapse = ",")
# [1] "GAD,AB"
Run Code Online (Sandbox Code Playgroud)

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

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

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

toString(tmp)
# [1] "GAD, AB"
Run Code Online (Sandbox Code Playgroud)

  • 嘿,这是解决tmp是一个向量这一事实的唯一答案,而不只是一堆值 - "paste"不做矢量.另一个选项是`do.call(paste,as.list(tmp))`. (3认同)

nau*_*101 33

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

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

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}
Run Code Online (Sandbox Code Playgroud)

或者如果您经常想要从向量中加入字符串(例如implode()从PHP):

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}
Run Code Online (Sandbox Code Playgroud)

允许您这样做:

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

此外,还有内置功能paste0,它与我的功能相同implode,但不允许使用自定义分隔符.它的效率略高于paste().


Vil*_*nen 31

> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"
Run Code Online (Sandbox Code Playgroud)

我通过搜索R连接字符串从Google找到了这个:http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html


Meg*_*ron 28

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

cat(s1, s2, sep=", ")
Run Code Online (Sandbox Code Playgroud)

  • 那么,4年后,当有大约十几个"粘贴"答案时,贴出"粘贴"答案的重点是什么? (4认同)
  • 当时我发现为自己总结多个答案很有帮助.目标不是收集选票,而是帮助其他人过滤所提供的许多解决方案.通常这就是我正在寻找的东西. (4认同)

Sua*_*PhD 20

其他方式:

sprintf("%s you can add other static strings here %s",string1,string2)
Run Code Online (Sandbox Code Playgroud)

它有时比paste()功能更有用.%s表示将包含主观字符串的位置.

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

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))
Run Code Online (Sandbox Code Playgroud)

产量

/this/is/a/path
Run Code Online (Sandbox Code Playgroud)


Qbi*_*bik 18

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

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

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

'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
Run Code Online (Sandbox Code Playgroud)

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


nei*_*fws 14

给定您创建的矩阵tmp:

paste(tmp[1,], collapse = ",")
Run Code Online (Sandbox Code Playgroud)

我假设您使用cbind创建矩阵有一些原因,而不是简单地:

tmp <- "GAD,AB"
Run Code Online (Sandbox Code Playgroud)