请参见以下可重现的示例:
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()
指定在连接的这一部分使用不同的分隔符,还是必须采用完全不同的方法?有什么想法吗?
答案 0 :(得分:5)
您需要另一个g++
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
,这要感谢@thelatemail
purrr::invoke
或者在reprex_df %>%
mutate(new_col = paste0("https://www.google.com/search?q=",
invoke(paste, ., sep = "+")
)
)
base R
答案 1 :(得分:3)
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="+"))