Использование gsub для извлечения символьной строки перед пробелом в R

У меня есть список дней рождения, которые выглядят примерно так:

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM")

Я хочу просто взять дату календаря из этой переменной (т.е. удалить все после первого появления белого пробела).

Вот что я пробовал до сих пор:

dob.abridged <- substring(dob,1,8)
dob
[1] "9/9/43 1" "9/17/88 " "11/21/48"
dob.abridged <- gsub(" $","", dob.abridged, perl=T)
> dob.abridged
[1] "9/9/43 1" "9/17/88"  "11/21/48"

Итак, мой код работает для дат календаря длиной 6 или 7, но не длины 8. Любые указатели на более эффективное регулярное выражение для использования с gsub, которые могут обрабатывать даты календаря длиной 6, 7 или 8?

Спасибо.

Ответ 1

Не нужно подстрока, просто используйте gsub:

gsub( " .*$", "", dob )
# [1] "9/9/43"   "9/17/88"  "11/21/48"

Пространство (), затем любой символ (.) любое число раз (*) до конца строки ($). См. ? Regex для изучения регулярных выражений.

Ответ 2

Я часто использую strsplit для подобных проблем, но мне нравится, как был простой ответ Ромена. Я подумал, что было бы интересно сравнить решение Ромена с ответом strsplit:

Здесь a strsplit решение:

sapply(strsplit(dob, "\\s+"), "[", 1)

Используя пакет microbenchmark и dob <- rep(dob, 1000) с исходными данными:

Unit: milliseconds
                                    expr       min        lq    median
                   gsub(" .*$", "", dob)  4.228843  4.247969  4.258232
 sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638
        uq       max neval
  4.268029  5.081608  1000
 14.756628 53.344984  1000

Явным победителем на машине Win 7 является регулярное выражение gsub от Romain. Спасибо за ответ и объяснение Ромен.