Сопоставьте два списка, один с частичными строками, а другой с полной строкой, верните всю строку, если совпадают

Сопоставьте два списка в R, один с частичными строками, а другой с полной строкой, верните всю строку, если совпадают. Возвращать только уникальные совпадения (один раз).

Итак, допустим, у меня есть файл CSV, и каждая строка имеет длинную строку (длинный список). Затем я сокращаю строку, используя substr, а затем удаляю все повторяющиеся строки, используя unique. Затем я хочу сравнить длинный список строк df12 с уникальным коротким списком df14, и если есть уникальные совпадения при частичном поиске строки (df14 против df12), то вернуть всю строку из df12.

Это df12 (длинный список строк)

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

Это df13 (сокращенные строки - не уникальные)

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

Это df14 (укороченные строки - уникальные строки после применения уникального метода)

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

Это результат, который я хочу в конце

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

person Elias EstatisticsEU    schedule 19.01.2016    source источник
comment
df13<-substr(df12, start=0, stop=30) не дает ожидаемого результата для меня. Должно быть df13<-substr(df12, start=0, stop=13)?   -  person NGaffney    schedule 20.01.2016


Ответы (1)


Это один из способов сопоставить каждую короткую строку в df14 со всеми возможными совпадениями в df12 и вывести их, включая короткую строку в качестве индекса в список, чтобы узнать, какая из них соответствует строкам в 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?"
person Gopala    schedule 20.01.2016
comment
Я получаю сообщение об ошибке " invalid regular expression, reason 'Missing ')"... Затем в вашем очень элегантном решении добавлено "sapply(df2, function(x) df1[grepl(x, df1, fixed=TRUE)])" Мне интересно, есть ли способ получить самое длинное из совпадений, если существует несколько совпадений для одной уникальной строки в короткий список строк? - person Elias EstatisticsEU; 20.01.2016
comment
Вы можете взять вывод приведенной выше команды sapply, сохранить его во что-то, скажем, под названием l, и вы можете запустить эту команду, чтобы получить самую длинную соответствующую длинную строку для каждой короткой строки: lapply(l, function(x) x[nchar(x) == max(nchar(x))]) - person Gopala; 20.01.2016
comment
Спасибо @user3949008! Это было очень полезно! - person Elias EstatisticsEU; 20.01.2016