2011-08-26 141 views
277

如何合并/合并R中的两个值? 比如我有:2个字符串如何连接?

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

我的目标是让TMP作为一个字符串

tmp_new = "GAD,AB" 

哪个函数能为我做到这一点?

+0

如果字符串是向量,这里的大多数答案都会打断,就像@ RichardScriven的答案笔记一样。 – smci

+0

@smci那我发布的小答案呢?任何改善它的建议? –

回答

13

,您创建:

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

我认为有一些原因你正在用cbind创建一个矩阵,而不是简单的:

tmp <- "GAD,AB" 
357
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" 

希望这有助于。

+6

混合字符串和向量或不同长度的向量在'paste()'中有点太灵活了,以满足我的喜好。例如,'paste(c('a','b'),'blah',c(1,2,3))'会导致一个错误1“”b blah 2“”一个错误3“ 。基本上,它会创建一个与传入的最长向量长度相同的字符串向量,并将其他向量/字符串循环到相同的长度。那里有足够的意外行为空间。 – naught101

+1

正确 - 但您能否提供解决问题的替代方法? – Rainer

+1

否 - 你的回答是正确的(正如大多数其他答案一样)。我只是注意到,粘贴的行为在其灵活性上是不寻常的。 – naught101

70

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

> help.search("concatenate") 

会引导您到paste()

20

正如其他人指出的,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,它做同样的事情作为我implode,但没有异体翼自定义分隔符。它比paste()略高效。

32

对于第一个非paste()的答案,我们可以看看stringr::str_c()(然后下面的toString())。它一直没有出现过这个问题,所以我认为提及它也存在很有用。如你所见,使用非常简单。

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

从它的文档文件描述中可以很好地解决这个问题。

要理解str_c是如何工作的,你需要想象你正在建立一个字符串矩阵。每个输入参数形成一个列,并使用通常的回收规则扩展为最长参数的长度。 sep字符串插入每列之间。如果collapse为NULL,则每行都折叠为一个字符串。如果在每行的末尾插入非空字符串,并且整个矩阵折叠为单个字符串。

新增2016年4月13日:这不完全一样,你需要的输出(额外的空间),但没有人要么提到。 toString()基本上是一个版本的paste()collapse = ", "硬编码的,所以你可以做

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

嘿,这是解决tmp是一个向量的唯一答案,而不仅仅是一堆值 - '粘贴'不做矢量。另一个选项是'do.call(paste,as.list(tmp))'。 – naught101

22

另外,如果你的目标是直接输出到一个文件或标准输出,你可以使用cat

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

那么在4年后,当有大约十几个'paste'回答时,发布'paste'回答的是什么? –

+3

当时我发现有助于为自己总结多个答案。目标不是收集选票,而是帮助其他人过滤众多提供的解决方案。通常这就是我要找的。 – Megatron

16

你可以创建你自己的操作:

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

您也可以重新定义“和”(&)运爱适易:

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

与基础语法搞乱是丑陋的,但如果你用自己的代码只是工作,你可以(几乎总是)与*代替逻辑& and运营商,做逻辑值的乘法,而不是使用所以使用paste()/paste0()逻辑 '与&'

+0

@Richard Scriven mayby我不明白,但看起来很直接,比较:'paste0(as.matrix(iris [1:4]),as.matrix(iris [1:4]))'和'as。矩阵(虹膜[1:4])%&%as.matrix(虹膜[1:4])' – Qbik

11

的另一种方法:

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 
+0

针对处理R的C程序员,sprintf对于“连接两个字符串”是熟悉的和有用的 – subsci

+0

非常好。如果你想把某些东西附加到一个字符串上,'paste'不够灵活。 – displayname

1

考虑这样的字符串列,结果应该是一个新列的情况下:

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")]子集,如果所有列ns需要粘贴。

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

好吧,但'stringi,stringr'库更快。 – smci