Сравните каждое значение списка с другим списком - PullRequest
0 голосов
/ 10 мая 2018

Полагаю, вопрос не говорит полной истории.

Допустим, у нас есть 2 списка, один - список из одного слова поиска, а другой - список из нескольких слов

Ex.

data.lookup <- c('one', 'two', 'three')

data.real <- c('somewhere one day', 'mysterious elephants', 'two apple-pies', 
'love three corner', 'coffee break', 'three cats')

Теперь мы хотим проверить, содержит ли каждый элемент в data.real слова из data.lookup или нет.

Например, «где-то один день» содержит «один»

Затем мы сохраняем «один» с тем же индексом, что и «где-то один день»

В настоящее время у меня есть эта функция, которая делает именно это.

checkFromList <- function (data.lookup, data.real) {

    df <- data.frame('sentence' = data.real, 'lookup' = 1:length(data.real))

    for (lookup in data.lookup) {

        iter <- 1 #set iteraetion

        for (sentence in data.real) {
            #If match then append
            if (grepl(lookup, sentence) == TRUE) {

                df[iter,2] <- lookup

            }

            iter <- iter + 1

        }

    }

    iter = 1 #set itereation 

    for (word in df[,2]) {

        if (is.element(word, data.lookup) == FALSE ) {

            df[iter, 2] <- 'nan'

        }

        iter <- iter + 1

    }

    return (df)

}

Запуск этой функции:

checkFromList(data.lookup, data.real)

Выход:

enter image description here

Я знаю, с точки зрения производительности эта функция невелика (слишком много для цикла).

Я прошу совета, как улучшить мой код. Где-нибудь я могу написать это лучше?

Кроме того, некоторые из вас могут подумать, что возникнет проблема, если в предложении будет более 2 поисковых слов. Данные, с которыми я работаю, содержат только 3 слова в предложении, и вероятность того, что в предложении будет более 2 поисковых слов, очень мала.

Цените всю помощь и советуйте!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Использование базы R:

stack(sapply(data.lookup, function(a) grep(a, data.real, value=T)))

             values    ind
1 somewhere one day    one
2    two apple-pies    two
3 love three corner  three
4        three cats  three

Если вы хотите сохранить NA:

stack(sapply(data.real, function(a){
    x = sapply(data.lookup, function(b) grepl(b,a))
    if(any(x)){names(which(x))} else {NA}
}))

  values                  ind
1    one    somewhere one day
2   <NA> mysterious elephants
3    two       two apple-pies
4  three    love three corner
5   <NA>         coffee break
6  three           three cats
0 голосов
/ 10 мая 2018

Мы можем сделать это, используя функцию stri_extract_all_regex из пакета stringi, где мы создаем шаблон регулярного выражения, используя paste0

library(stringi)
stri_extract_all_regex(data.real, paste0(data.lookup, collapse = "|"))


#[[1]]
#[1] "one"

#[[2]]
#[1] NA

#[[3]]
#[1] "two"

#[[4]]
#[1] "three"

#[[5]]
#[1] NA

#[[6]]
#[1] "three"

Мы можем создать ожидаемый вывод данных как

extract_words <- stri_extract_all_regex(data.real, paste0(data.lookup, 
                 collapse = "|"))
data.frame(sentence = data.real, lookup = unlist(extract_words))


#             sentence                lookup
#1    somewhere one day                   one
#2 mysterious elephants                  <NA>
#3       two apple-pies                   two
#4    love three corner                 three
#5         coffee break                  <NA>
#6           three cats                 three

Мы также можем использовать str_extract из stringr или str_extract_all

library(stringr)
str_extract(data.real, paste0(data.lookup, collapse = "|"))

#[1] "one"   NA      "two"   "three" NA      "three"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...