在 R 中使用 paste() 连接具有多个分隔符的字符串
Posted
技术标签:
【中文标题】在 R 中使用 paste() 连接具有多个分隔符的字符串【英文标题】:Concatenating strings with multiple separators using paste() in R 【发布时间】:2019-02-25 06:16:00 【问题描述】:请参阅以下可重现的示例:
require(tidyverse)
set.seed(1)
reprex_df <- data.frame(
var1 = sample(1:10),
var2 = sample(11:20),
var3 = sample(21:30)
)
我正在尝试创建一个新列,其中包含通过将每一行中的其他变量连接成带有“https://www.google.com/search?q=”的字符串而创建的 URL,使用以下代码:
reprex_df %>% mutate(new_col = c(paste("https://www.google.com/search?q=", var1, var2, var3, sep="+")))
结果:
https://www.google.com/search?q=+3+13+30
这样做的问题是它在https://www.google.com/search?q=
和var1
之间放置了一个+
,这不是URL 的有效格式。我不需要这些字符串之间的分隔符。像这样:
https://www.google.com/search?q=3+13+30
我是否可以使用paste()
以某种方式指定对这部分连词使用不同的分隔符,还是必须采取完全不同的方法?有什么想法吗?
【问题讨论】:
注意,don’t userequire
, use library
。
对于任何想知道的人来说,这是因为 require() 返回一个逻辑,这对于有条件地加载它很有用,或者在一个需要运行的函数中,即使没有找到库。 Library() 更适合设置通用环境。
@KonradRudolph,我会补充一点(虽然目标要多得多):在问题中,加载您需要的包,而不是导入其他 25 个的元包(有时很大) 包。善待您的回答者,我通常在已经运行的 R 会话中查看内容,并且由于我不亲自加载所有这些包,因此我不想将它们放在命名空间中(哦,冲突! )。它相当于 python 的 from pkgname import *
,对于命名空间管理来说,既不鼓励也(再次客观地)马虎。 (是的......这只是我的意见。)
@r2evans 完全同意,不仅在问题中,而且通常在代码中。 Tidyverse 是惊人的。 tidyverse
(包)是坏的。
我想知道是否有人可以证明 library(*)
(在 R 中)或 from * import *
(在 python 中)看到碰撞和其他问题的大火......
【参考方案1】:
你需要另一个paste
reprex_df %>%
mutate(new_col = paste0(
"https://www.google.com/search?q=",
paste(var1, var2, var3, sep = "+")
))
# var1 var2 var3 new_col
#1 3 13 30 https://www.google.com/search?q=3+13+30
#2 4 12 22 https://www.google.com/search?q=4+12+22
#3 5 16 26 https://www.google.com/search?q=5+16+26
# ...
如果您不想输入所有变量名称 var1
到 varn
,请尝试 purrr::invoke
,感谢 @thelatemail
reprex_df %>%
mutate(new_col = paste0("https://www.google.com/search?q=",
invoke(paste, ., sep = "+")
)
)
或在base R
url <- "https://www.google.com/search?q=" # optional
transform(reprex_df,
new_col = paste0(url, do.call(paste, c(reprex_df, sep = "+"))))
【讨论】:
相当明智。谢谢。 如果你不想输入var1-varn
,你可以使用do.call
或purrr
invoke()
wrapper - reprex_df %>% mutate(new_col = paste0( "https://www.google.com/search?q=", invoke(paste, ., sep="+") ))
【参考方案2】:
paste0
也许最简单的方法是使用paste0
指定+ 号作为参数,而不是使用sep
:
root <- "https://www.google.com/search?q="
reprex_df %>%
mutate(new_col = paste0(root, var1, "+", var2, "+", var3))
sprintf
sprintf
是另一种可能性:
fmt <- "https://www.google.com/search?q=%d+%d+%d"
reprex_df %>%
mutate(new_col = sprintf(fmt, var1, var2, var3))
sub
另一种可能性是使用问题中的代码,但随后使用代码删除第一个 +:
root <- "https://www.google.com/search?q="
reprex_df %>%
mutate(new_col = paste(root, var1, var2, var3, sep="+"),
new_col = sub("\\+", "", new_col))
allow extra +
Google 会忽略等号后的 +,因此另一种方法是只允许存在额外的加号。
root <- "https://www.google.com/search?q="
reprex_df %>%
mutate(new_col = paste(root, var1, var2, var3, sep="+"))
【讨论】:
非常全面。给你这个答案。以上是关于在 R 中使用 paste() 连接具有多个分隔符的字符串的主要内容,如果未能解决你的问题,请参考以下文章