Разбивка слов в шаблон букв: код работает не так, как ожидалось - PullRequest
1 голос
/ 05 июля 2019

У меня есть список слов и список шаблонов общих символов, найденных в словах. Сценарий работает, просматривая список слов, а затем проверяет, какой шаблон символов находится в слове, и, наконец, отображает результаты в таблице.

Готовый стол должен выглядеть так:

word    CharPatLen  charpat01 charpat02 charpat03 charpat04
father  4           f         a         th        er
there   3           th        er        e
after   4           a         f         r         er

Вместо этого я получаю таблицу ниже, и в поле charpat03 для слова "там" все идет не так, как надо. 'F' здесь должно быть вместо 'e', ​​а следующая строка пуста.

word    CharPatLen  charpat01 charpat02 charpat03 charpat04
father  4           f         a         th        er
there   3           th        er        f
after   4  

Я также получаю следующее предупреждающее сообщение, которое я попытался исправить с помощью поисков в Google, но безуспешно

'Warning message:
In as.numeric(paste(as.numeric(charIndexStart), charIndexEnd, sep = "")) :
  NAs introduced by coercion'

Помощь! Я не уверен, что происходит со сценарием.

Спасибо, что нашли время, чтобы просмотреть мое сообщение.

##################################################
# This script loops through a word list then break the word into character (char)
# pattern found character pattern list 
# 
# e.g 
#using the word list         ( father, there, after)
#using the char pattern list (th,er,f, a, e,t)
# 
# it should return the following
# 
# word    CharPatLen  charpat01 charpat02 charpat03 charpat04
# father  4           f         a         th        er
# there   3           th        er        e
# after   4           a         f         r         er
#####################################################


word      <- c("father", "there", "after")
CharPatLen <- c(0, 0, 0)
charpat01 <- c("", "", "" )
charpat02 <- c("", "", "" )
charpat03 <- c("", "", "" )
charpat04 <- c("", "", "" )
charpat05 <- c("", "", "" )
wordList <- data.frame(word, CharPatLen, charpat01,charpat02,charpat03,charpat04,charpat05,stringsAsFactors = F)

textPat <- c("th", "er", "f","a","e","t")
frequency <- c(0,0,0,0,0,0)
textPattern <- data.frame(textPat,frequency, stringsAsFactors = F)


#######################################
# 01 loop through word list              
#######################################
for (text in wordList$word) {#4loop01
  # track what parts of the word a found char pattern
  charSelectionTracker <- rep(1, times=nchar(text))

  #found char patterns from word, order/range and the char pattern
  FoundcharPatternholder  <- data.frame(order= integer(),charPattern = character())

  #########################################
  # 02 loop through character patterns list  
  #########################################
     for (pattern in textPattern$textPat) { #4loop02


       if(sum(charSelectionTracker)== 0)
       {#charSelect

         #reorder patterns
         rank <- order(FoundcharPatternholder$order)
         FoundcharPatternholder<- FoundcharPatternholder[rank,]

         wordList[which(wordList$word == text),"CharPatLen"] = nrow(FoundcharPatternholder)

         for (patPao in 1:nrow(FoundcharPatternholder))
          {
           wordList[which(wordList$word == text),patPao+2] = as.character(FoundcharPatternholder[patPao,2])
           }

         break
       }#charSelect 

        #find all char pattern in word
        patFoundAt <- unlist(gregexpr (pattern,text)[[1]])

        #########################################
        # 03 check that each pattern within a word is valid and not used in an other char pattern
        #########################################
         for (charIndexStart in patFoundAt) 
               {#4loop03


           charIndexEnd = charIndexStart + nchar(pattern)-1

           if( sum(charSelectionTracker[charIndexStart:charIndexEnd]) == nchar(pattern) & sum(charSelectionTracker)> 0)
               {#PatExtract

             #track what letters have been used by character pattern
             charSelectionTracker[charIndexStart:charIndexEnd]=0

             #order/index in pattern 
             patIndex <- as.numeric(paste(as.numeric(charIndexStart),charIndexEnd,  sep = ''))

             innerPatternholder  <- data.frame(order= patIndex,charPattern = pattern)

             FoundcharPatternholder <- rbind(FoundcharPatternholder, innerPatternholder)
              }#PatExtract

            }#4loop03



     } #4loop02

  }#4loop01

1 Ответ

0 голосов
/ 05 июля 2019

Вам, вероятно, лучше потерять вложенные циклы for. str_extract_all и str_count из пакета stringr могут быть полезны для упрощения кода:

library(stringr)

## data
words <- c("father", "there", "after")
textPat <- paste(c("th", "er", "f","a","e","t"), collapse = "|")

## extract matching patterns 
charPat <- str_extract_all(words, textPat, simplify = TRUE) 
colnames(charPat) <- sprintf("charpat%02d", seq_len(ncol(charPat)))

## count matched patterns per word 
charPatLen <- str_count(words, textPat)

## combine into data.frame
cbind(data.frame(word = words, CharPatLen = charPatLen), charPat)
#>     word CharPatLen charpat01 charpat02 charpat03 charpat04
#> 1 father          4         f         a        th        er
#> 2  there          3        th        er         e          
#> 3  after          4         a         f         t        er

Создано в 2019-07-05 пакетом Представления (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...