Конкатенация строк с несколькими разделителями с использованием paste () в R - PullRequest
0 голосов
/ 21 сентября 2018

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

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 ]

0 голосов
/ 21 сентября 2018
  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="+"))
    
0 голосов
/ 21 сентября 2018

Вам нужен еще один 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 = "+"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...