Удалить специальные символы в 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 ответ
Есть несколько вещей, которые усложняют это:
- Вы хотите заменить символы чем-то похожим, а не просто конвертировать кодировку. В вашем примере "
<9d>" не означает "e", это означает сложную версию "e", то есть R не просто изменит ее. Но для этого есть функции - Это выглядит как
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 обработать это и заменяем старые значения этими заменами.
Только в последней строке мы заменяем специальные символы на (в этом примере) "е"