2013-07-17 4 views
3

Возможно, заданный вопрос, я застрял здесь.Подсчитайте вхождения слова по шаблону в R

Из XML-файла я пытаюсь найти все вхождения, их строки и общее количество появления каждой 12-символьной строки, содержащей только альфу и цифры (буквально буквенно-числовые).

Например: если мой файл xmlInput, я пытаюсь выполнить поиск и извлечение всех вхождений, позиций и итоговых значений 12-символьной строки альфа-num.

Пример вывода:

String  Total Count  Line-Num 
CPXY180D2324 2    132,846 
CPXY180D2131 1    372 
CPCY180D2139 1    133  

Я знаю, что я мог бы использовать regmatches, чтобы получить все вхождения строки по шаблону. Я использовал ниже для этого: (Спасибо за вашу помощь в этом).

ProNum12<-regmatches(xmlInput, regexpr("([A-Z0-9]{12})", xmlInput)) 
ProNum12 

regmatches дать мне все матчи, которые следуют шаблону. но он не дает мне номера строк, где появился шаблон. grep дает мне номера строк всех вхождений.

Я думал, что могу использовать библиотеку textcntTau, но не смог заставить ее работать правильно. Возможно, это не правильный пакет?

Есть ли в R пакет или библиотека, которая будет искать все слова, соответствующие шаблону, и возвращать общий счет появления и linenumers каждого события? Если такого пакаджа нет, любая идея, как я могу это сделать, используя любой из вышеперечисленных или лучших?

+1

Вы не могли бы редактировать свой пост, чтобы отформатировать код? Кроме того, команды 'quoting' (с отметками' ') R облегчают чтение. Пример: 'grep' вместо Grep. – Arun

+0

Отредактировано. Надеюсь, теперь это лучше? Благодаря! – BRZ

+1

Ницца, было бы лучше, если бы вы могли дать нам строку, которая должна дать результат, который вы показали. – Arun

ответ

3

Не видя ваших данных, трудно предложить предложение о том, как действовать. Вот пример с некоторыми строчными символьными строками, которые могут помочь вам приступить к поиску собственного решения.

Во-первых, некоторые примеры данных (которые, вероятно, не выглядит, как ваши данные):

x <- c("Some text with a strange CPXY180D2324 string stuck in it.", 
     "Some more text with CPXY180D2131 strange strings CPCY180D2139 stuck in it.", 
     "Even more text with strings that CPXY180D2131 don't make much sense.", 
     "I'm CPXY180D2324 tired CPXY180D2324 of CPXY180D2324 text with CPXY180D2131 strange strings CPCY180D2139 stuck in it.") 

Мы можем разделить его пробелами. Это еще одна область не может соответствовать с вашей реальной проблемой, но опять же, это только, чтобы помочь вам начать работу (или помочь другим обеспечить гораздо лучший ответ, как это может быть.)

x2 <- strsplit(x, " ") 

Поиск в разделять данные для значений, соответствующих вашему шаблону регулярного выражения. Создайте data.frame, который включает номера строк и сопоставленную строку.

temp <- do.call(rbind, lapply(seq_along(x2), function(y) { 
    data.frame(line = y, 
      value = grep("([A-Z0-9]{12})", x2[[y]], 
          value = TRUE)) 
})) 
temp 
# line  value 
# 1 1 CPXY180D2324 
# 2 2 CPXY180D2131 
# 3 2 CPCY180D2139 
# 4 3 CPXY180D2131 
# 5 4 CPXY180D2324 
# 6 4 CPXY180D2324 
# 7 4 CPXY180D2324 
# 8 4 CPXY180D2131 
# 9 4 CPCY180D2139 

Создайте свой data.frame номеров строк и количество.

with(temp, data.frame(
    lines = tapply(line, value, paste, collapse = ", "), 
    count = tapply(line, value, length))) 
#     lines count 
# CPXY180D2324 1, 4, 4, 4  4 
# CPCY180D2139  2, 4  2 
# CPXY180D2131 2, 3, 4  3 

Во всяком случае, это чисто предположение (и я убиваю время ....)

+0

Извините за поздний ответ. Мой входной файл - это xml-файл, и я вроде как рыбалка в темноте с этими строками. Таким образом, решение, с которым я работаю, - чрезвычайно глупые и крутые.Но работает: я уверен, что вы намного более элегантны, чем мое решение regmatches-> sqldf-> apply. Будет проверять и то и другое. Спасибо за вашу помощь - simak – BRZ

+2

@simak, я слышал, что рыбалка более увлекательна с компанией, поэтому не стесняйтесь обновлять свой вопрос несколькими строками XML-файлов, с которыми вы работаете, и посмотрите, найдут ли другие рыболовы лучшие подходы. – A5C1D2H2I1M1N2O1R2T1

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