如何合并/合并R中的两个值? 比如我有:2个字符串如何连接?
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目标是让TMP作为一个字符串
tmp_new = "GAD,AB"
哪个函数能为我做到这一点?
如何合并/合并R中的两个值? 比如我有:2个字符串如何连接?
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目标是让TMP作为一个字符串
tmp_new = "GAD,AB"
哪个函数能为我做到这一点?
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"
我发现这个由谷歌通过搜索[R连接字符串:给定矩阵,TMP http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
,您创建:
paste(tmp[1,], collapse = ",")
我认为有一些原因你正在用cbind创建一个矩阵,而不是简单的:
tmp <- "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"
希望这有助于。
help.search()
是一个方便的功能,例如,
> help.search("concatenate")
会引导您到paste()
。
正如其他人指出的,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()
略高效。
对于第一个非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"
嘿,这是解决tmp是一个向量的唯一答案,而不仅仅是一堆值 - '粘贴'不做矢量。另一个选项是'do.call(paste,as.list(tmp))'。 – naught101
另外,如果你的目标是直接输出到一个文件或标准输出,你可以使用cat
:
cat(s1, s2, sep=", ")
那么在4年后,当有大约十几个'paste'回答时,发布'paste'回答的是什么? –
当时我发现有助于为自己总结多个答案。目标不是收集选票,而是帮助其他人过滤众多提供的解决方案。通常这就是我要找的。 – Megatron
你可以创建你自己的操作:
'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`
您也可以重新定义“和”(&
)运爱适易:
'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
与基础语法搞乱是丑陋的,但如果你用自己的代码只是工作,你可以(几乎总是)与*
代替逻辑& and
运营商,做逻辑值的乘法,而不是使用所以使用paste()/paste0()
逻辑 '与&'
@Richard Scriven mayby我不明白,但看起来很直接,比较:'paste0(as.matrix(iris [1:4]),as.matrix(iris [1:4]))'和'as。矩阵(虹膜[1:4])%&%as.matrix(虹膜[1:4])' – Qbik
的另一种方法:
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
针对处理R的C程序员,sprintf对于“连接两个字符串”是熟悉的和有用的 – subsci
非常好。如果你想把某些东西附加到一个字符串上,'paste'不够灵活。 – displayname
考虑这样的字符串列,结果应该是一个新列的情况下:
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 = ", "))
好吧,但'stringi,stringr'库更快。 – smci
如果字符串是向量,这里的大多数答案都会打断,就像@ RichardScriven的答案笔记一样。 – smci
@smci那我发布的小答案呢?任何改善它的建议? –