2011-06-04 5 views
11

Ho dati in R che può apparire come segue:Espressioni regolari in R per cancellare tutti i caratteri dopo il primo spazio?

USDZAR Curncy 
R157 Govt 
SPX Index 

In altre parole, una sola parola, in questo caso un identificatore di protezione Bloomberg, seguito da un'altra parola, che è la classe di sicurezza, separati da uno spazio . Voglio spogliare la classe e lo spazio per arrivare a:

USDZAR 
R157 
SPX 

Qual è il modo più efficiente di farlo in R? Sono espressioni regolari o devo fare qualcosa come farei in MS Excel usando i comandi mid e find? ad esempio in Excel direi:

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

che significa restituire una sottostringa partendo carattere 1, e termina al numero di carattere del primo spazio (meno 1 per cancellare lo spazio reale).

Devo fare qualcosa di simile in R (nel qual caso, qual è l'equivalente), o le espressioni regolari possono aiutare qui? Grazie.

risposta

23

1) provare questo in cui l'espressione regolare corrisponde a uno spazio seguito da una sequenza di caratteri e sub sostituisce quello con una stringa con zero caratteri:

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

2) un'alternativa se si voleva le due parole in colonne separate in una cornice dati sono le seguenti. Qui as.is = TRUE rende le colonne carattere anziché fattore.

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

Fantastico grazie. –

1

La regex potrebbe essere quella di cercare:

\x20.* 

e sostituirlo con una stringa vuota.

Se vuoi sapere se è più veloce, è solo ora.

+0

Grazie, proprio così sto scrivendo: ("\ x20 *", "R157 Govt")> grep e sto tornando: [1] 1, cioè il valore 1. Dove vado da lì? –

+0

questo tipo di regex non funziona bene con R. –

+0

Il problema con quell'uso era che non si capiva che il backslash è speciale nella regex e quindi deve essere "sottoposto a escape" stesso. E ha bisogno di avere DUE baackslash prima di esso quando si trova nell'argomento del modello. Prova: 'sub (" \\\ x20. * "," "," R157 Govt ")' –

2

Se siete come me, in quel di espressione regolare rimarrà sempre un imperscrutabile, mistero frustrante, questa soluzione clunkier esiste anche:

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

Il fisso = TRUE non è strettamente necessario, proprio sottolineando che puoi farlo (caso semplice) senza conoscere veramente la prima cosa su regexp.

Modificato per riflettere il commento di @ Wojciech.

+0

haha ​​sì - grazie a joran. Lo stile clunk è quello a cui sono abituato in Excel, quindi mi chiedevo se avrei dovuto (finalmente) imparare le espressioni regolari.La funzione anonima –

+0

non è necessaria qui, quindi è possibile semplificare l'eliminazione di un elenco (lapply (strsplit (x, "", fixed = TRUE), "[", 1)). –

+0

Grazie a @Wojciech, modifico di conseguenza ... – joran

4

è abbastanza facile con stringr:

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

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