438

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

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

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

tmp_new = "GAD,AB"

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

4

12 回答 12

565
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"
于 2011-08-26T08:50:42.143 回答
90

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

> help.search("concatenate")

将引导您到paste().

于 2011-09-29T19:22:57.153 回答
49

对于第一个非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()基本上是一个paste()带有collapse = ", "硬编码的版本,所以你可以这样做

toString(tmp)
# [1] "GAD, AB"
于 2014-07-08T07:26:47.270 回答
41

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

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

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

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

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,它与 my 做同样的事情implode,但不允许自定义分隔符。它的效率略高于paste().

于 2014-07-08T07:06:20.260 回答
35
> 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

于 2011-08-26T07:33:50.210 回答
32

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

cat(s1, s2, sep=", ")
于 2015-06-12T15:33:36.803 回答
24

您可以创建自己的运营商:

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

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

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

混淆基线语法是丑陋的,但是paste()/paste0()如果你只使用自己的代码,你可以(几乎总是)用逻辑运算符替换逻辑& and运算符*并进行逻辑值的乘法,而不是使用逻辑“和”

于 2016-04-23T09:49:16.100 回答
23

另一种方式:

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
于 2016-09-30T06:39:26.233 回答
14

给定您创建的矩阵 tmp:

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

我认为您使用 cbind 创建矩阵是有原因的,而不是简单地:

tmp <- "GAD,AB"
于 2011-08-26T08:02:09.553 回答
3

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

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 = ", ")) 
于 2017-01-23T12:01:11.957 回答
3

glue是作为 的一部分开发的新函数、数据类和包,具有tidyverse许多扩展功能。它结合了 paste、sprintf 和以前的其他答案的功能。

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

reprex 包(v0.2.1)于 2019 年 3 月 6 日创建

是的,对于这个问题中的简单示例来说,这有点矫枉过正,但在许多情况下都很强大。(见https://glue.tidyverse.org/

pastewith下面的比较的快速示例。glue代码更容易输入,看起来更容易阅读。

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."

reprex 包(v0.2.1)于 2019 年 3 月 6 日创建

于 2019-03-07T00:38:16.927 回答
2

另一个非粘贴答案:

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

在哪里

 data <- c("GAD", "AB")
于 2018-06-06T12:54:31.793 回答