2016-01-19 17 views
5

Abbina due elenchi in R, uno con stringhe parziali e un altro con stringa intera, restituisce l'intera stringa se corrisponde. Restituisce solo le corrispondenze univoche (una volta).Abbina due elenchi, uno con stringhe parziali e l'altro con stringa intera, restituisce l'intera stringa se corrisponde

Quindi, supponiamo di avere un file CSV e ogni riga ha una stringa lunga (la lunga lista). Quindi, abbreviare la stringa utilizzando substr, quindi elimina le stringhe duplicate utilizzando unique. Quindi voglio confrontare l'elenco di stringhe lunghe df12 con l'elenco breve univoco df14 e se esistono corrispondenze univoche nella ricerca di stringhe parziali (df14 rispetto a df12), quindi restituire l'intera stringa da df12.

Questo è df12 (lista di stringhe lungo)

[1] I like stackoverflow very much today 
    [2] I like stackoverflow much today 
    [3] I dont like stackoverflow very much today 
    [4] I dont like you! 
    [5] What? 

df13<-substr(df12, start=0, stop=30) 

Questo è df13 (stringhe accorciati - non uniche)

[1] I like stacko 
[2] I like stacko 
[3] I dont like s 
[4] I dont like y 
[5] What? 
df14<-unique(df13) 

Questo è df14 (stringhe abbreviati - stringhe univoche dopo l'applicazione metodo unico)

[1] I like stacko 
    [2] I dont like s 
    [3] I dont like y 
    [4] What? 

Questo è il risultato che voglio alla fine

[1] I like stackoverflow very much today 
    [2] I dont like stackoverflow very much today 
    [3] I dont like you! 
    [4] What? 
+0

'df13 <-substr (df12, start = 0, stop = 30)' non produce l'output previsto per me. Dovrebbe essere 'df13 <-substr (df12, start = 0, stop = 13)'? – NGaffney

risposta

3

Questo è un approccio per soddisfare ogni stringa breve a df14 con tutte le possibili corrispondenze di DF12 e di uscita, compreso il breve stringa come un indice nella lista di sapere quale corrisponde a quelli in df12:

df1 <- c('I like stackoverflow very much today', 'I like stackoverflow much today', 
     'I dont like stackoverflow very much today', 'I dont like you!', 
     'What?') 
df2 <- c('I like stacko', 'I dont like s', 'I dont like y', 'What?') 

sapply(df2, function(x) df1[grepl(x, df1)]) 
$`I like stacko` 
[1] "I like stackoverflow very much today" "I like stackoverflow much today"  

$`I dont like s` 
[1] "I dont like stackoverflow very much today" 

$`I dont like y` 
[1] "I dont like you!" 

$`What?` 
[1] "What?" 
+0

Viene visualizzato un errore "" espressione regolare non valida, motivo 'Mancante') "' ... Quindi nella tua soluzione molto elegante è stato aggiunto '" sapply (df2, function (x) df1 [grepl (x, df1, fixed = TRUE)]) "" Mi chiedo, c'è un modo per ottenere la più lunga delle partite, se esistono più corrispondenze per una stringa Unica alla lista delle stringhe brevi? –

+1

Puoi prendere l'output del comando 'sapply' sopra, salvarlo in qualcosa chiamato' l 'diciamo, ed è possibile eseguire questo comando per ottenere la stringa lunga più lunga corrispondente per ogni stringa breve: 'lapply (l, function (x) x [nchar (x) == max (nchar (x))]) ' – Gopala

+0

Grazie @ user3949008! Questo è stato molto utile! –