2016-01-19 8 views
5

Dopasuj dwie listy w R, jedną z częściowymi ciągami i inną z pełnym łańcuchem, zwracając cały ciąg, jeśli pasuje. Zwróć tylko unikalne dopasowania (raz).Dopasuj dwie listy, jedną z częściowymi ciągami i drugą z pełnym łańcuchem, zwracając cały ciąg, jeśli pasuje

Załóżmy, że mam plik CSV i każdy wiersz ma długi ciąg (długa lista). Następnie skracam ciąg znaków za pomocą substr, a następnie usuwam wszystkie powtarzające się łańcuchy używając unikalnego. Następnie chcę porównać długą listę ciągów znaków df12 z unikalną krótką listą df14, a jeśli występują unikalne dopasowania przy częściowym wyszukiwaniu ciągów znaków (df14 w porównaniu z df12), należy zwrócić cały ciąg od df12.

To df12 (długa lista ciąg)

[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) 

To df13 (skrócone Strings - nie unikatowe)

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

To df14 (skrócone Strings - unikalne ciągi po zastosowaniu unikalnej metody)

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

Jest to wynikiem, że chcę w końcu

[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)' nie daje oczekiwanego wyniku dla mnie. Czy powinien to być 'df13 <-substr (df12, start = 0, stop = 13)'? – NGaffney

Odpowiedz

3

To jedno podejście, aby dopasować każdy krótki ciąg w df14 ze wszystkich możliwych meczów w DF12 i wyjście im w tym krótkim ciągiem jako indeks w liście do poznania który pasował do tych w 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

Otrzymuję komunikat o błędzie "nieprawidłowe wyrażenie regularne, przyczyna" brakująca ")" 'Następnie w swoim bardzo eleganckim rozwiązaniu dodano' "sapply (df2, function (x) df1 [grepl (x, df1, poprawiono = TRUE)]) "Zastanawiam się, czy istnieje sposób na uzyskanie najdłuższego z meczów, jeśli istnieje kilka dopasowań dla jednego Unikalnego ciągu do krótkiej listy? –

+1

Możesz pobrać wyjście powyższej komendy 'sapply', zapisz ją w coś o nazwie' l' powiedzmy, i możesz uruchomić to polecenie, aby uzyskać najdłuższy pasujący długi łańcuch dla każdego krótkiego ciągu: 'lapply (l, function (x) x [nchar (x) == max (nchar (x))]) ' – Gopala

+0

Dziękuję @ user3949008! To było bardzo pomocne! –

Powiązane problemy