我如何连接(合并,组合)两个值? 例如,我有:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目标是将“tmp”中的两个值连接到一个字符串:
tmp_new = "GAD,AB"
哪个函数可以帮我做这个?
我如何连接(合并,组合)两个值? 例如,我有:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目标是将“tmp”中的两个值连接到一个字符串:
tmp_new = "GAD,AB"
哪个函数可以帮我做这个?
当前回答
另一种方法:
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
其他回答
对于第一个非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()基本上是一个带有collapse = ", "硬编码的paste()版本,所以你可以这样做
toString(tmp)
# [1] "GAD, AB"
Glue是作为tidyverse的一部分开发的一个新函数、数据类和包,具有许多扩展功能。它结合了paste、sprintf和前面其他答案的特性。
tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB
由reprex包于2019-03-06创建(v0.2.1)
是的,对于这个问题中的简单例子来说,它有点过头了,但在许多情况下都很强大。(参见https://glue.tidyverse.org/)
快速的例子比较粘贴与下面。胶水代码更容易输入,看起来也更容易阅读。
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包于2019-03-06创建(v0.2.1)
paste()
才是正确的选择。正如之前的海报所指出的,粘贴可以做两件事:
将值串联成一个“字符串”,例如:
> paste("Hello", "world", sep=" ")
[1] "Hello world"
其中参数sep指定在参数之间用于连接的字符, 或者折叠字符向量
> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"
其中参数collapse指定要折叠的vector元素之间使用的字符。
你甚至可以将两者结合起来:
> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"
你可以创建自己的操作符:
'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`
你也可以重新定义'and'(&)操作符:
'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
混淆基线语法是丑陋的,但是使用paste()/paste0()也是如此,如果你只使用自己的代码,你可以(几乎总是)将逻辑&和操作符替换为*,并执行逻辑值的乘法,而不是使用逻辑'and '
另一种方法:
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