我抓取数据并接收到一些字符变量,这些字符变量包含一个狭窄的不间断空格(Unicode U + 202F)。如果所得的字符变量在矢量中,则在R中显示良好。例如,测试返回在控制台中显示为狭窄的空间:
test <- "variable1 variable2"
<br>
test
但是,如果我将向量添加到列表/数据帧/小标题,它将显示为variable1<U+202F>variable2
。如果我使用fileEncoding = "UTF-8"
将此数据帧另存为csv文件,并使用相应的编码将其打开,则仍会在观察结果中显示。我现在的解决方法是使用gsub,但我想知道自己做错了什么。
答案 0 :(得分:3)
罪犯是format.default
:
test <- "variable1\u202Fvariable2"
print(test)
[1] "variable1 variable2"
format(test)
#[1] "variable1<U+202F>variable2"
format
由format.data.frame
调用,而print.data.frame
又被调用。
一种解决方案可能是定义一个字符方法:
format.character <- function(x, ...) x
DF <- data.frame(x = 1:5) #beware of stringsAsFactors
DF$test <- test
DF #spaces are actually thin spaces in R console
# x test
#1 1 variable1 variable2
#2 2 variable1 variable2
#3 3 variable1 variable2
#4 4 variable1 variable2
#5 5 variable1 variable2
显然,这种简单的方法将破坏依赖于其他format
自变量的函数。
OTOH,为什么您要关心打印稀疏的空间?
答案 1 :(得分:0)
一种方法是使用gsub
将所有unicode字符转换为空白:
text <- "variable1\u202Fvariable2"
new_text <- gsub("[^\x20-\x7E]", " ", text)
在这里,我匹配所有常用ASCII字符的取反,范围从十六进制代码20(SPACE)到7E(〜)。这种方法的缺点是,您可能会无意中删除了超出期望的内容,但是您始终可以在字符类中添加排除项。
输出:
> format(text)
[1] "variable1<U+202F>variable2"
> format(new_text)
[1] "variable1 variable2"
答案 2 :(得分:0)
有同样问题的人:有一个名为textclean
的程序包,它用replace_non_ascii()
替换或删除了非ASCII字符。