Использование 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. Спасибо за ответ и объяснение Ромен.