Регулярные выражения в R, чтобы стереть все символы после первого пробела?

У меня есть данные в R, которые могут выглядеть так:

USDZAR Curncy
R157 Govt
SPX Index

Другими словами, одно слово, в данном случае - идентификатор безопасности Bloomberg, за которым следует другое слово, которое является классом безопасности, разделенным пробелом. Я хочу разделить класс и пространство, чтобы добраться до:

USDZAR
R157
SPX

Какой самый эффективный способ сделать это в R? Является ли это регулярными выражениями или я должен что-то делать, как в MS Excel, используя команды mid и find? например, в Excel, я бы сказал:

=MID(@REF, 1, FIND(" ", @REF, 1)-1)

что означает возврат подстроки, начинающейся с символа 1, и завершение символьного номера первого пространства (меньше 1 для удаления фактического пространства).

Нужно ли мне делать что-то подобное в R (в этом случае, что эквивалентно), или могут помочь регулярные выражения? Спасибо.

Ответ 1

1) Попробуйте, где регулярное выражение соответствует пробелу, за которым следует любая последовательность символов, и sub заменяет строку с нулевыми символами:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")
sub(" .*", "", x)
## [1] "USDZAR" "R157"   "SPX"  

2) Альтернатива, если вы хотите, чтобы два слова в отдельных столбцах в кадре данных были следующими. Здесь as.is = TRUE делает столбцы скорее символом, чем фактором.

read.table(text = x, as.is = TRUE)
##       V1     V2
## 1 USDZAR Curncy
## 2   R157   Govt
## 3    SPX  Index

Ответ 2

Это довольно легко с stringr:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")

library(stringr)
str_split_fixed(x, " ", n = 2)[, 1]

Ответ 3

Если вы похожи на меня, то в этом регулярном выражении всегда останется неисповедимая, расстраивающая тайна, это бесстыдное решение также существует:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")
unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1))

Фиксированный = ИСТИНА не является строго необходимым, просто указывая, что вы можете сделать это (простой случай), действительно зная первое о regexp's.

Отредактировано с учетом комментария @Wojciech.

Ответ 4

Регулярное выражение будет искать:

\x20.*

и замените пустой строкой.

Если вы хотите узнать, быстрее ли это, просто время.