我们可以为此使用strcapture:它接受一个带有一个或多个(.)组的正则表达式,一个向量,并根据proto=中存在的字段/类返回一个data.frame。如果未找到任何组,则不会找到任何组。
基础R
cbind(df, strcapture(".*-to-([^-/]*)-from-([^-/]*).*", df$Page, proto=list(to="", from="")))
# Page Count to from
# 1 /es/import-340600-to-mx-from-de/summary 153 mx de
# 2 /es/import-340600-to-de-from-mx/summary 78 de mx
# 3 /es/import-071320-to-sv-from-cr/summary 72 sv cr
# 4 /en/import-340111-to-ru-from-ir/summary 58 ru ir
# 5 /en/import-870423-to-hk-from-de/summary 57 hk de
# 6 /es/import-392049-to-mx-from-de/summary 55 mx de
# 7 /es/import-080440-to-mx-from-es/summary 48 mx es
# 8 /es/import-340600-to-mx-from-jp/summary 46 mx jp
# 9 /en/import-852691-to-tr-from-ua/summary 42 tr ua
# 10 /es/import-180620-to-mx-from-us/summary 42 mx us
dplyr
library(dplyr)
df %>%
mutate(strcapture(".*-to-([^-/]*)-from-([^-/]*).*", Page, list(to="", from="")))
# # A tibble: 10 x 4
# Page Count to from
# <chr> <dbl> <chr> <chr>
# 1 /es/import-340600-to-mx-from-de/summary 153 mx de
# 2 /es/import-340600-to-de-from-mx/summary 78 de mx
# 3 /es/import-071320-to-sv-from-cr/summary 72 sv cr
# 4 /en/import-340111-to-ru-from-ir/summary 58 ru ir
# 5 /en/import-870423-to-hk-from-de/summary 57 hk de
# 6 /es/import-392049-to-mx-from-de/summary 55 mx de
# 7 /es/import-080440-to-mx-from-es/summary 48 mx es
# 8 /es/import-340600-to-mx-from-jp/summary 46 mx jp
# 9 /en/import-852691-to-tr-from-ua/summary 42 tr ua
# 10 /es/import-180620-to-mx-from-us/summary 42 mx us
如果你需要在另一个不存在的情况下抓住一个,那么也许:
df %>%
mutate(to = stringr::str_match(Page, ".*-to-([^/-]*)")[,2], from = stringr::str_match(Page, ".*-from-([^/-]*)")[,2])
# # A tibble: 10 x 4
# Page Count to from
# <chr> <dbl> <chr> <chr>
# 1 /es/import-340600-to-mx-from-de/summary 153 mx de
# 2 /es/import-340600-TO-de-from-mx/summary 78 NA mx
# 3 /es/import-071320-to-sv-from-cr/summary 72 sv cr
# 4 /en/import-340111-to-ru-from-ir/summary 58 ru ir
# 5 /en/import-870423-to-hk-from-de/summary 57 hk de
# 6 /es/import-392049-to-mx-from-de/summary 55 mx de
# 7 /es/import-080440-to-mx-from-es/summary 48 mx es
# 8 /es/import-340600-to-mx-from-jp/summary 46 mx jp
# 9 /en/import-852691-to-tr-from-ua/summary 42 tr ua
# 10 /es/import-180620-to-mx-from-us/summary 42 mx us
或更一般地(一个或多个这样的模式):
df %>%
mutate(as.data.frame(lapply(
setNames(nm = c("to", "from")),
function(ptn) stringr::str_match(Page, sprintf(".*-%s-([^/-]*)", ptn))[,2])
))
# # A tibble: 10 x 4
# Page Count to from
# <chr> <dbl> <chr> <chr>
# 1 /es/import-340600-to-mx-from-de/summary 153 mx de
# 2 /es/import-340600-TO-de-from-mx/summary 78 NA mx
# 3 /es/import-071320-to-sv-from-cr/summary 72 sv cr
# 4 /en/import-340111-to-ru-from-ir/summary 58 ru ir
# 5 /en/import-870423-to-hk-from-de/summary 57 hk de
# 6 /es/import-392049-to-mx-from-de/summary 55 mx de
# 7 /es/import-080440-to-mx-from-es/summary 48 mx es
# 8 /es/import-340600-to-mx-from-jp/summary 46 mx jp
# 9 /en/import-852691-to-tr-from-ua/summary 42 tr ua
# 10 /es/import-180620-to-mx-from-us/summary 42 mx us