См. Следующий воспроизводимый пример:

require(tidyverse)

set.seed(1)
reprex_df <- data.frame(
  var1 = sample(1:10),
  var2 = sample(11:20),
  var3 = sample(21:30)
)

Я пытаюсь создать новый столбец, содержащий URL-адреса, созданные путем объединения других переменных из каждой строки в строку с "https://www.google.com/search?q= ", используя следующий код:

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(), или мне нужно использовать совершенно другой подход? Любые идеи?

2
Clayton Glasser 21 Сен 2018 в 00:24

2 ответа

Лучший ответ
  1. paste0 Возможно, самый простой способ - указать знаки + в качестве аргументов с помощью paste0, а не использовать sep:

    root <- "https://www.google.com/search?q="
    reprex_df %>% 
      mutate(new_col = paste0(root, var1, "+", var2, "+", var3))
    
  2. sprintf sprintf - еще одна возможность:

    fmt <- "https://www.google.com/search?q=%d+%d+%d"
    reprex_df %>%
      mutate(new_col = sprintf(fmt, var1, var2, var3))
    
  3. sub Еще одна возможность - использовать код из вопроса, но после него добавить код для удаления первого +:

    root <- "https://www.google.com/search?q="
    reprex_df %>% 
      mutate(new_col = paste(root, var1, var2, var3, sep="+"),
             new_col = sub("\\+", "", new_col))
    
  4. allow extra + Google игнорирует + после знака равенства, поэтому другой подход - просто позволить дополнительному плюсу существовать.

    root <- "https://www.google.com/search?q="
    reprex_df %>% 
      mutate(new_col = paste(root, var1, var2, var3, sep="+"))
    
3
G. Grothendieck 20 Сен 2018 в 22:18

Вам нужен еще один 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 = "+"))))
6
markus 21 Сен 2018 в 08:23