Удалить специальные символы в R из.docx

Я видел различные посты об удалении специальных символов в R (например, этот: Удалить все специальные символы из строки в R?), Но ни одна из стратегий не сработала для моей проблемы.

У меня есть стенограмма, которую я читаю с помощью qdap read.transcript(). Когда я читаю в документе, строки со специальными символами выглядят так:

If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!

Я пытался:

     ATL1$X2 <- gsub("[^0-9A-Za-z///,.?()' ]", "", ATL1$X2)
     If anyone knows how to simply change these special characters (i.e e1b89d to e), again please feel free to update

Но это не удаляет специальные символы, а также удаляет!

Я также попробовал:

 str_replace_all(ATL1$X2, "[^[:alnum:]]", " ")
If anyone knows how to simply change these special characters  i e  e1  b8  9d  to e   again please feel free to update 

Но это еще хуже и удаляет все знаки препинания и все еще не решает мою проблему.

Наконец, я также попробовал:

 iconv(ATL1$X2, from = 'UTF-8', to = 'ASCII//TRANSLIT')
 If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!

Но и здесь ничего не изменилось.

В идеальном мире результат будет выглядеть так:

 If anyone knows how to simply change these special characters (i.e e e e to e), again please feel free to update!

Таким образом, специальные символы читаются так, как они должны быть. Если это невозможно, я бы честно согласился, если бы он просто удалил специальные символы (но не другие символы, такие как восклицательные знаки) и выглядел так:

 If anyone knows how to simply change these special characters (i.e to e), again please feel free to update!

Спасибо!

1 ответ

Решение

Есть несколько вещей, которые усложняют это:

  1. Вы хотите заменить символы чем-то похожим, а не просто конвертировать кодировку. В вашем примере "<9d>" не означает "e", это означает сложную версию "e", то есть R не просто изменит ее. Но для этого есть функции
  2. Это выглядит как qdap.transcript пытается быть полезным. По крайней мере, то, что вы показываете здесь, и ваши результаты согласуются с тем, что они не являются специальными символами, а буквально означают "<9d>". Так что если вы попытаетесь удалить специальные символы, gsub счастливо выполняет и удаляет "<" и ">", оставляя "e1" и т. д. в покое.

Чтобы решить вашу проблему, я думаю, что вы хотите преобразовать обратно в специальные символы, а затем использовать stri_trans_general от stringi пакет. Я уверен, что есть и другие аналогичные функции, но эта работает для меня. Оказывается, преобразование обратно в специальные символы - сложная часть, но у меня есть некоторый рабочий код:

library(stringi)
mystring <- 'If anyone knows how to simply change these special characters (i.e <e1><b8><9d> to e), again please feel free to update!'
pos <- gregexpr('(<[A-Fa-f0-9]{2}>)+', mystring)[[1]]

replace <- substring(mystring, pos, pos+attr(pos, 'match.length')-1)
replace <- sapply(replace, function(r) {
  eval(parse(text=paste0('\'', gsub('>', '', gsub('<', '\\\\x', r)), '\'')))
})
for(i in seq_along(replace)) {
  mystring <- sub('(<[A-Fa-f0-9]{2}>)+', replace[i], mystring)
}
mystring <- stri_trans_general(mystring, 'latin-ascii')

Сначала мы извлекаем все, что выглядит как шестнадцатеричные числа между "<" и ">", затем преобразуем их в литерал "\xe1\xb8\x9d", а затем просим R обработать это и заменяем старые значения этими заменами.
Только в последней строке мы заменяем специальные символы на (в этом примере) "е"

Другие вопросы по тегам