在 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 use require, 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
# ...

如果您不想输入所有变量名称 var1varn,请尝试 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.callpurrr invoke() wrapper - reprex_df %&gt;% 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() 连接具有多个分隔符的字符串的主要内容,如果未能解决你的问题,请参考以下文章

R - 在 paste() 中的单个文本段落中抑制分隔符

R语言paste应用

R函数详解

shell中的cut和paste函数,可以从多个文本中提取特定的列

R语言之字符串的组合与拆分

R语言paste函数