2012-10-24 4 views
56

Ho un file di testo 371 MB contenente dati micro RNA. In sostanza, vorrei selezionare solo le righe che contengono informazioni sul microRNA umano.Selezione di righe in cui una colonna ha una stringa come "hsa .." (corrispondenza stringa parziale)

Ho letto nel file utilizzando read.table. Di solito, realizzo ciò che vorrei con sqldf - se avesse una sintassi simile (selezionare * da <> dove miRNA mi piace 'hsa'). Sfortunatamente - sqldf non supporta quella sintassi.

Come posso farlo in R? Mi sono guardato attorno allo stackoverflow e non vedo un esempio di come posso eseguire una corrispondenza di stringa parziale. Ho persino installato il pacchetto stringr - ma non ha proprio quello di cui ho bisogno.

Che cosa vorrei fare, è qualcosa di simile - dove sono selezionate tutte le righe dove hsa- *.

selectedRows <- conservedData[, conservedData$miRNA %like% "hsa-"] 

che, naturalmente, non è la sintassi corretta.

Qualcuno può aiutarmi con questo? Grazie mille per la lettura.

Asda

+6

Puoi pubblicare alcune righe dei tuoi dati, preferibilmente usando qualcosa come 'dput (head (conservedData))'. – A5C1D2H2I1M1N2O1R2T1

risposta

89

Ho notato che si parla di una funzione %like% nel vostro approccio corrente. Non so se si tratta di un riferimento allo %like% da "data.table", ma se lo è, puoi sicuramente usarlo come segue.

Si noti che l'oggetto non deve essere un data.table (ma anche ricordare che sottoinsiemi approcci per data.frame s e data.table s non sono identici):

library(data.table) 
mtcars[rownames(mtcars) %like% "Merc", ] 
iris[iris$Species %like% "osa", ] 

se questo è quello che si aveva, allora forse si aveva appena confuso le posizioni di riga e colonna per i dati di subsetting.


Se non si desidera caricare un pacchetto, è possibile provare a utilizzare grep() per cercare la stringa si sta corrispondenti. Ecco un esempio con il mtcars set di dati, dove ci sono corrispondenti tutte le righe in cui i nomi di riga comprende "Merc":

mtcars[grep("Merc", rownames(mtcars)), ] 
      mpg cyl disp hp drat wt qsec vs am gear carb 
# Merc 240D 24.4 4 146.7 62 3.69 3.19 20.0 1 0 4 2 
# Merc 230 22.8 4 140.8 95 3.92 3.15 22.9 1 0 4 2 
# Merc 280 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4 
# Merc 280C 17.8 6 167.6 123 3.92 3.44 18.9 1 0 4 4 
# Merc 450SE 16.4 8 275.8 180 3.07 4.07 17.4 0 0 3 3 
# Merc 450SL 17.3 8 275.8 180 3.07 3.73 17.6 0 0 3 3 
# Merc 450SLC 15.2 8 275.8 180 3.07 3.78 18.0 0 0 3 3 

E, un altro esempio, utilizzando il iris dataset ricerca della stringa di osa:

irisSubset <- iris[grep("osa", iris$Species), ] 
head(irisSubset) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 4   4.6   3.1   1.5   0.2 setosa 
# 5   5.0   3.6   1.4   0.2 setosa 
# 6   5.4   3.9   1.7   0.4 setosa 

per il vostro problema prova:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ] 
+0

+1: si noti inoltre che 'grep' supporta le espressioni regolari, quindi si potrebbe voler usare grep per'^hsa-'. – nico

+2

@nico: infatti, 'grep' viene dal comando ed/g/re (global/regular expression/print), e rivela il suo vero potere solo al padrone dell'espressione regolare-fu ;-): http: //en.wikipedia.org/wiki/Grep –

+0

Il suggerimento **% like% ** è fantastico! Consiglio di metterlo in cima alla tua risposta. –

17

LIKE dovrebbe funzionare in SQLite:

require(sqldf) 
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3)) 
sqldf("select * from df where name LIKE '%er%'") 
    name id 
1 robert 2 
2 peter 3 
+0

SQLDF è la cosa migliore per la quotazione. Tuttavia, non può eliminare righe. –

+1

Perché un pacchetto R viene caricato con 'require()' qui – rgalbo

+0

Perché non è una libreria R standard e devi installarlo manualmente e quindi caricare usando la funzione 'require'. – bartektartanus

34

Prova str_detect() dal pacchetto stringr, che rileva la presenza o l'assenza di un modello in una stringa.

Ecco un approccio che incorpora anche il tubo %>% e filter() dal pacchetto dplyr:

library(stringr) 
library(dplyr) 

CO2 %>% 
    filter(str_detect(Treatment, "non")) 

    Plant  Type Treatment conc uptake 
1 Qn1  Quebec nonchilled 95 16.0 
2 Qn1  Quebec nonchilled 175 30.4 
3 Qn1  Quebec nonchilled 250 34.8 
4 Qn1  Quebec nonchilled 350 37.2 
5 Qn1  Quebec nonchilled 500 35.3 
... 

Questo filtra il set di dati campione di CO2 (che viene fornito con R) per righe in cui la variabile trattamento contiene la stringa "non". È possibile regolare se str_detect trova corrispondenze fisse o utilizza un'espressione regolare - consultare la documentazione per il pacchetto stringr.