Из вашего сообщения не ясно, хотите ли вы , чтобы имела отдельную запись для каждого найденного вами числа. Если вы это сделаете, вы можете создать список из каждой записи, содержащей числа, а затем unnest
список, чтобы получить несколько строк.
library(tidyverse)
inputTbl <- tibble(record = 1:2,
comment = c("3 night in A", "2 nights in A, 1 nights in B."))
inputTbl %>%
mutate(numNight = map(comment, ~ unlist(str_extract_all(.x, "\\d+")))) %>%
unnest() %>%
mutate(numNight = as.double(numNight))
Результат:
# A tibble: 3 x 3
record comment numNight
<int> <chr> <dbl>
1 1 3 night in A 3
2 2 2 nights in A, 1 nights in B. 2
3 2 2 nights in A, 1 nights in B. 1
И если вы хотите захватить и отель, вы можете построить тибл и разложить его.
inputTbl <- tibble(record = 1:2,
comment = c("3 night in Sheraton", "2 Nights in Waldorf, 1 night in Sands."))
inputTbl %>%
mutate(numNight =
map(comment,
~ tibble(Nights = unlist(str_extract_all(.x, "\\d+")),
Hotel = unlist(str_extract_all(.x,
"(?ix) # Perl-style regex, space+case insensitive
(?<= nights? \\s in \\s) # Detect 'nights in'; dont caputre
(\\w+) # The hotel
"))))) %>%
unnest()
# A tibble: 3 x 4
record comment Nights Hotel
<int> <chr> <chr> <chr>
1 1 3 night in Sheraton 3 Sheraton
2 2 2 Nights in Waldorf, 1 night in Sands. 2 Waldorf
3 2 2 Nights in Waldorf, 1 night in Sands. 1 Sands