2016-05-25 2 views
0

Продолжая мое исследование в текстовом анализе, я столкнулся с еще одним roadblock. Я понимаю логику, но не знаю, как это сделать в R. Вот что я хочу сделать : У меня есть 2 CSVs- 1. содержит 10 000 комментариев 2. содержащий список слов Я хочу выбрать все те комментарии, которые имеют какие-либо слова во 2-м CSV. Как я могу это сделать?Извлечение только соответствующих комментариев из списка комментариев

пример:

**CSV 1:** 
this is a sample set 
the comments are not real 
this is a random set of words 
hope this helps the problem case 
thankyou for helping out 
i have learned a lot here 
feel free to comment 

**CSV 2** 
sample 
set 
comment 

**Expected output:** 
this is a sample set 
the comments are not real 
this is a random set of words 
feel free to comment 

Пожалуйста, обратите внимание: различные формы слов, также считается, например, комментарии и комментарии оба считаются.

+0

оба - список комментариев и слов соответственно – eclairs

+0

вы можете сделать свой пример воспроизводимым? – Sotos

ответ

1

Мы можем использовать grep после paste Элементы во втором наборе данных.

v1 <- scan("file2.csv", what ="") 
lines1 <- readLines("file1.csv") 
grep(paste(v1, collapse="|"), lines1, value=TRUE) 
#[1] "this is a sample set"   "the comments are not real" 
#[3] "this is a random set of words" "feel free to comment" 
0

Сначала нужно создать два объекта под названием lines и words.to.match из ваших файлов. Вы можете сделать это следующим образом:

lines <- read.csv('csv1.csv', stringsAsFactors=F)[[1]] 
words.to.match <- read.csv('csv2.csv', stringsAsFactors=F)[[1]] 

Допустим, они выглядят следующим образом:

lines <- c(
    'this is a sample set', 
    'the comments are not real', 
    'this is a random set of words', 
    'hope this helps the problem case', 
    'thankyou for helping out', 
    'i have learned a lot here', 
    'feel free to comment' 
) 
words.to.match <- c('sample', 'set', 'comment') 

Вы можете вычислить матчи с двумя вложенными *apply- функции:

matches <- mapply(
    function(words, line) 
     any(sapply(words, grepl, line, fixed=T)), 
    list(words.to.match), 
    lines 
) 
matched.lines <- lines[which(matches)] 

Что происходит Вот? Я использую mapply для вычисления функции по каждой строке в строках, принимая в качестве другого аргумента words.to.match. Обратите внимание, что мощность list(words.to.match) равна 1. Я просто перерабатываю этот аргумент в каждом приложении. Затем внутри функции mapply я вызываю функцию sapply, чтобы проверить, соответствует ли какое-либо из слов строке (я проверяю соответствие через grepl).

Это не обязательно самое эффективное решение, но для меня это немного более понятно. Другим способом можно вычислить matches является:

matches <- lapply(words.to.match, grepl, lines, fixed=T) 
matches <- do.call("rbind", matches) 
matches <- apply(matches, c(2), any) 

Мне не нравится это решение, потому что вам нужно сделать do.call("rbind",...), который немного Hacky.

Смежные вопросы