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

时间:2011-08-26 07:25:35

标签: r string-concatenation r-faq

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

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

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

tmp_new = "GAD,AB"

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

12 个答案:

答案 0 :(得分:452)

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 :(得分:80)

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

> help.search("concatenate")

会引导您paste()

答案 2 :(得分:39)

对于第一个非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"

答案 3 :(得分:32)

正如其他人所指出的,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()略高效。

答案 4 :(得分:30)

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

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

答案 5 :(得分:28)

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

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

答案 6 :(得分:17)

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

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

您还可以重新定义&#39;和&#39; (&)运营商:

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

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

答案 7 :(得分:17)

另一种方式:

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

答案 8 :(得分:14)

给定您创建的矩阵tmp:

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

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

tmp <- "GAD,AB"

答案 9 :(得分:2)

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

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 :(得分:1)

另一个非粘贴答案:

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

其中

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

答案 11 :(得分:1)

# Create sample array width, height = 1000, 4000 val_array = xr.DataArray(data=np.random.randint(0, 10, size=(height, width)).astype(np.float32), coords={'x': np.linspace(3000, 5000, width), 'y': np.linspace(-3000, -5000, height)}, dims=['y', 'x']) # Create sample points n = 10000 x_points = np.random.randint(3000, 5000, size=n) y_points = np.random.randint(-5000, -3000, size=n) 是新功能,数据类和程序包,已作为%%timeit # ATTEMPT 1 np.diagonal(val_array.interp(x=x_points, y=y_points).squeeze().values) 32.6 s ± 1.01 s per loop (mean ± std. dev. of 7 runs, 1 loop each) 的一部分开发,具有许多扩展功能。它结合了粘贴,sprintf和先前其他答案中的功能。

glue

reprex package(v0.2.1)于2019-03-06创建

是的,对于这个问题中的简单示例来说,这是过分的了,但是在许多情况下却很有效。 (请参阅https://glue.tidyverse.org/

与下面的tidyversetmp <- tibble::tibble(firststring = "GAD", secondstring = "AB") (tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}")) #> GAD,AB 相比较的简单示例。 paste代码更易于输入,更易于阅读。

with

reprex package(v0.2.1)于2019-03-06创建