Неожиданная ошибка символа при итерации по вектору инструкций, хранящихся в простом тексте, которые должны быть выполнены в строке с использованием вложенной структуры применения - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь стандартизировать данную строку, используя определенный набор правил.Эти правила были формализованы с использованием нескольких операций «gsub», которые хранятся во фрейме данных (но при этом они называются атомарным вектором с использованием $) в виде простого текста.

У меня есть 4 отдельных фрейма данных, заполненных строками, которые я хочу стандартизировать.Я реализовал цикл for, который работает, однако, он включает в себя переписывание операций gsub для каждого фрейма данных и довольно трудоемкий для запуска.

Хотя я знаю, что apply не обеспечивает никакого реального ускорения по сравнению с циклом for, если не вызывается скомпилированная функция, мне нужен абстрагированный метод для выполнения этой стандартизации над несколькими фреймами данных (как тамбудет больше в будущем).

Чтобы добиться этого обобщения, я попытался написать вложенную структуру apply.Я оцениваю операции gsub в вызове функции из apply, используя "eval (parse (text = x))".Я хочу повторить этот вызов apply для элементов фрейма данных со строками, сохраненными для стандартизации, поэтому применяется более высокий вложенный метод.

Я ожидаю, что команда apply зацикливается на всех операциях и применяет их последовательно к строке, все время циклически перебирая сам фрейм данных строки.Тем не менее, это явно не работает.Он выдает:

library(data.table)
library(stringi)

repdf <- data.table(Names = c("Palmolive Co. Pvt. Ltd.","Hellenic P. Co.","Freeman's Consortium pvt. ltd."),Address =c("15, Parkway Broadsite, Mumbai","Greco-Roman Architecture Street, Pune","1-B,Black Mesa Compound, Crowbar Street, Delhi."))
gsubop_df <- data.table(Commands = c('"stri_replace_all_regex(x, "Co\\b\\.?","Company")"','"stri_replace_all_regex(x, "\\(P\\.\\)$","Private Limited")"','"stri_replace_all_regex(x, "Corpn\\b\\.?","Corporation")"'))

repdf$Names <- apply(repdf[,1],2,function(x) apply(gsubop_df,2,eval(parse(text = as.character(x)))))
#> Error in parse(text = as.character(x)): <text>:1:11: unexpected symbol
#> 1: Palmolive Co.
#>       

Как я уже говорил, я написал цикл for, который работает:

name_rule_length <- length(name_clean_rules_apply$Commands)
for(i in 1:nrow(mh_rules_nme)){
MG$Name <- eval(parse(text= mh_rules_nme[i,]))
}

Пример операции gsub в mh_rules_nme:

stri_replace_all_regex(MG$Name,"M(?:\\|\\/)s","")

Это, однако, требует от меня переписать операцию gsub для каждого фрейма данных, в то время как я стремлюсь к достижению той же функции, используя общий "x" изнутри apply.

Однако, когда я делаю атомарный eval (анализ), он работает нормально.Однако в циклической операции выдается эта ошибка.

Любая помощь в решении этого очень ценится.

1 Ответ

0 голосов
/ 11 февраля 2019

Я не совсем понимаю, почему вы используете apply для циклического перебора одного столбца data.table.Вы должны использовать его с margin = 2 только для матриц.Для data.frames / data.tables вы должны использовать lapply.В любом случае, все это не нужно, поскольку stri_replace_all_regex векторизовано:

gsubop_df <- data.table(regex = c( "Co\\b\\.?", "P\\.", "Corpn\\b\\.?"), #changed slightly for illustration
                        replacement = c("Company", "Private Limited", "Corporation"))


stri_replace_all_regex(repdf[,Names], replacement = gsubop_df$replacement,
                       pattern = gsubop_df$regex, vectorize_all = FALSE)
#[1] "Palmolive Company Pvt. Ltd."      "Hellenic Private Limited Company" "Freeman's Consortium pvt. ltd."  
...