我有一个非常大的数据集(70k行,2600列,CSV格式),我通过网络抓取创建。不幸的是,在某些时候进行预处理,处理等一些有问题的字符已经以奇怪的方式编码,我在处理它们时遇到了问题。
我有以下字符串:
x = "but it doesn<U+0092>t matter"
Looking up the code,我们可以看到它应该是字符’
,实际应该是'
(数据是用户生成的,因此可能包含各种奇数字符)。虽然从查看该角色,但似乎其他人也有问题(1,2,3)。它被标记为控制角色,不确定是什么,但也许这就是为什么它很难处理。
关于R中的Unicode的大多数其他问题都涉及Unicode,格式如此\u0092
。
Encoding()
试试吧:
#> x = "but it doesn<U+0092>t matter"
#> Encoding(x)
#[1] "unknown"
#> Encoding(x) = "UTF-8"
#> Encoding(x)
#[1] "unknown"
#> x
#[1] "but it doesn<U+0092>t matter"
所以这似乎没有做任何事情。
有一些先前的问题涉及这种Unicode格式并尝试转换它们:
奇怪的是,他们提供了工作的例子,但是我没有。
#> test.string <- "This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
#> Encoding(test.string)
#[1] "unknown"
#> to_true_unicode(test.string)
#[1] "This is a α β β γ test δ string."
可是:
#> x2 = to_true_unicode(x)
#> x2
#[1] "but it doesn\u0092t matter"
#> cat(x2)
#but it doesnt matter
#> Encoding(x2)
#[1] "UTF-8"
因此,它设法从&lt; \u
格式转换为U+....>
格式,并使用cat()
打印没有该符号的字符(或SO上的错误符号)。
我只有有限数量的这些问题,所以我或许可以使用搜索替换来解决它。但是:
#> #base-r
#> gsub(x = x, pattern = "<U+0092>", replacement = "'")
#[1] "but it doesn<U+0092>t matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x, pattern = "<U+0092>", "'")
#[1] "but it doesn<U+0092>t matter"
因此替换似乎不起作用,但它确实适用于\u
版本:
#> #base-r
#> gsub(x = x2, pattern = "\u0092", replacement = "'")
#[1] "but it doesn't matter"
#> #stringr/stringi
#> library(stringr)
#> str_replace(x2, pattern = "\u0092", "'")
#[1] "but it doesn't matter"
因此,这表明了一种工作方法:1)将<U+>
格式转换为\u
格式,然后使用搜索替换。
stringi::stri_unescape_unicode()
似乎不适用于任何一个版本:
#> stringi::stri_unescape_unicode(x)
#[1] "but it doesn<U+0092>t matter"
#> stringi::stri_unescape_unicode(x2)
#[1] "but it doesn\u0092t matter"
是否有一些普遍适用的方式来处理这样的问题?
我的sessionInfo是:
> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252 LC_MONETARY=Danish_Denmark.1252
[4] LC_NUMERIC=C LC_TIME=Danish_Denmark.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] stringr_1.0.0
loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.2.3 stringi_1.0-1
在Windows 8.1,64位上通过RStudio(0.99.893,预览)运行R.键盘和时间单位是丹麦语,但其他一切都是英语。
答案 0 :(得分:1)
不确定它是否会对你有用,但是出于相同的症状,我确实将字符串转换为ascii:
x <- iconv(x, "", "ASCII", "byte")
对于非ascii字符,指示为"<xx>"
,带有字节的十六进制代码。
然后,您可以将十六进制代码gsub为适合您的值。