В качестве варианта других ответов я бы предложил написать функцию, которая выполняет манипуляцию
longest_match <- function(x, pattern) {
matches <- str_match_all(x, pattern)
purrr::map_chr(matches, ~ .[which.max(nchar(.))])
}
, а затем использовать ее
dataframe %>%
mutate(mymatch = longest_match(text, "\\w+"))
В качестве комментария это кажется лучшепопрактиковаться, чтобы изолировать функцию, которая делает новый материал longest_match()
от манипуляций, включенных mutate()
.Например, функция проста в тестировании, может использоваться в других обстоятельствах и может быть изменена («вернуть последнее, а не первое самое длинное совпадение») независимо от шага преобразования данных. Нет никакого реального смысла вставлять все в одинline, поэтому имеет смысл написать строки кода, которые логически выполняют одну вещь - найти все совпадения, отобразить все совпадения на самые длинные, ... purrr::map_chr()
лучше, чем sapply()
, потому что он более устойчив - он гарантируетчто результатом является символьный вектор, так что что-то вроде
> df1 = dataframe[FALSE,]
> df1 %>% mutate(mymatch = longest_match(text, "\\w+"))
# A tibble: 0 x 2
# ... with 2 variables: text <chr>, mymatch <chr>
«делает правильные вещи», т. е. mymatch
является символьным вектором (sapply()
вернет список в этом случае).