Другой вариант, в базе R.
df <- data.frame(A=c("Alex", "likes", "a lot", "of", "food"), B=c("but", "lala 54 hi", "number and 33 hello", "face soap 34 hello", "35 hello"))
regmatches(df$B, gregexpr("^\\D*(?=\\d)", df$B, perl=TRUE))
# [[1]]
# character(0)
# [[2]]
# [1] "lala "
# [[3]]
# [1] "number and "
# [[4]]
# [1] "face soap "
# [[5]]
# [1] ""
Если вы не знакомы с регулярными выражениями:
^
: начало строки \\D*
ноль или более нецифров, аналогично [^0-9]*
(?=\\d)
означает «ожидайте цифру вперед, но не включайте ее в возвращаемый шаблон» (хороший пример для поиска: https://www.regular -expressions.info / lookaround.html );это расширение perl для регулярного выражения, то есть perl=TRUE
. Это дает вектор длины 0 для первого.С этим достаточно легко справиться, возможно, с помощью функции быстрого помощника:
replace_len0 <- function(x, replace=NA) `[<-`(x, lengths(x) < 1, replace)
unlist(replace_len0(regmatches(df$B, gregexpr("^\\D*(?=\\d)", df$B, perl=TRUE)), ""))
# [1] "" "lala " "number and " "face soap " ""
(я установил замену по умолчанию на NA
, потому что, на мой взгляд, разница между "естьпустая строка ""
перед первым числом " и " нет номера ". Вам.)
Это можно легко присвоить df$C
при необходимости.