2012-09-13 17 views
6

Come posso creare diverse colonne sulla base dello spazio, ad esempio: "Vado fuori"Trovare il numero di spazi in una stringa

ANs 3 
Column1 Column2 Column3 Column14 
I   am  going out 
+0

Forse si vuole 'read.fwf' anche se non sono sicuro di quello che stai cercando. –

risposta

14

Se si desidera che i valori delle colonne attuali, come il tuo esempio sembra per indicare, allora si può leggere una tabella da un collegamento di testo:

> read.table(textConnection("I am going Out")) 
    V1 V2 V3 V4 
1 I am going Out 

per rispondere il titolo della tua domanda, vale a dire quanti spazi ci sono, è possibile utilizzare ncol per contare le colonne di cui sopra, e sottrarre uno. Tuttavia, se siete solo interessato al numero di spazi, il seguente è più efficiente:

length(gregexpr(" ", "I am going Out")[[1]]) 

Questo utilizza un'espressione regolare per cercare gli spazi.

Il [[1]] prende il primo elemento dell'elenco risultante, che corrisponde al primo elemento del vettore di input con "I am going Out" come suo unico elemento. Se hai passato un vettore diverso, la tua lista potrebbe avere più di un elemento, o nessuna per un vettore vuoto.

Se non c'è spazio, gregexpr restituirà comunque un elenco di lunghezza 1, con -1 come posizione della partita per indicare che non c'era alcuna corrispondenza. Ciò causa il codice sopra riportato in modo errato riportare un risultato in quel caso. Una soluzione più elaborata, che si occupa di questo e anche accetta vettori come input, è la seguente:

countSpaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) }) } 

La funzione funziona come segue: gregexpr restituirà un lista dei risultati, uno per ogni elemento di input vectors. sapply itererà su quell'elenco e, per ciascun elemento dell'elenco, calcola il numero di corrispondenze. Invece di contare lo length del vettore di posizioni corrispondenti, utilizza sum per contare solo i valori non negativi, lasciando cadere qualsiasi -1 causato da una corrispondenza non riuscita. Esiste una conversione implicita da FALSE/TRUE a 0/1 che si verifica in tale somma. Il risultato di sapply sarà di nuovo un vettore e quindi corrisponderà perfettamente al vettore di input.

Questa funzione può essere utilizzata per riscrivere un frame di dati, come richiesto in one comment. Quindi supponendo di avere un frame dati chiamato foo con stringhe nella colonna bar e che deve essere modificato per contenere questi conteggi in una nuova colonna baz. È possibile scrivere questo come

foo <- transform(foo, baz = countSpaces(bar)) 
+0

+1. A seconda di cosa vogliono, però, questo * potrebbe * essere più appropriato: 'length (gregexpr (" [] + "," I am out out ") [[1]])' (answer = 3). Con quella frase, (con spazi aggiuntivi), il metodo che hai usato conta * ciascuno * di spazio. – A5C1D2H2I1M1N2O1R2T1

+1

Hmm. Come si aggiungono più spazi nei commenti? – A5C1D2H2I1M1N2O1R2T1

+2

@mrdwab, vedere http://meta.stackexchange.com/questions/30020/multiple-spaces-in-code-in-comments-get-merged-into-one. Soluzione alternativa: utilizzare Spazio non interruzione, immesso come un codice unicode U + 00A0. – MvG

3

Un altro modo è quello di utilizzare la funzione strsplit:

R> strsplit("I am going Out", " ")[[1]] 
[1] "I"  "am" "going" "Out" 

quindi abbiamo diviso il primo argomento - I am going Out - dal secondo argomento - lo spazio vuoto. Poi possiamo semplicemente usare length:

R> length(strsplit("I am going Out", " ")[[1]]) 
[1] 4 
+0

Ma non vogliamo sapere il numero di parole. Quindi penso che la risposta di MvG sia più appropriata. – rinni

+0

Accetto che la risposta di @ MvG sia migliore, ma non seguo il tuo commento su "Non conosciamo il numero di parole" – csgillespie

+0

Bene, vogliamo sapere il numero di _spaces_ e non il numero di _words_. Calcoli il numero di parole. – rinni

3

Devo ammettere che non ho letto molto attentamente in modo che questo non può essere quello che stai dopo, ma una possibilità è ..

x <- "I am going Out" 
nchar(x)- nchar(gsub(" ", "", x)) 

Un'alternativa al suggerimento originale di MvG (anche se meno bella):

as.data.frame(matrix(unlist(strsplit("I am going Out", "\\s+", perl=TRUE)), nrow=1)) 
1

È inoltre possibile utilizzare str_count dal pacchetto stringr. Questi sono meno prolissi, e evitare le espressioni regolari può essere un po 'più veloce.

library(stringr) 
text = "I am going Out" 
#matches regular expression 
str_count(text, ' ') 

Oppure, se si vuole qualcosa di più veloce

#matches literal text 
str_count(text, fixed(' ')) 
Problemi correlati