编辑 :感谢 R Yoda ,我终于能够为我面临的问题创建一个可重现的示例:
x = rawToChar(as.raw(c(0xa0, 0x31, 0x31, 0x2e, 0x31, 0x33, 0x32, 0x35, 0x39, 0x32)))
trimws(x)
=>问题:如何修剪x?
问题的旧文:
请参阅附件截图。遗憾的是,我无法创建可重现的示例,因为dput
正在影响结果......
任何人都知道如何调查x出了什么问题?领先的空白似乎不是标准空格!
charToRaw(x)
给出a 31 31 31 2e 31 33 32 35 39 32
dput(charToRaw(x))
给出as.raw(c(0xa0, 0x31, 0x31, 0x2e, 0x31, 0x33, 0x32, 0x35, 0x39,
0x32))
Encoding(x)
提供"unknown"
(与Encoding(" 11.132592")
相同)
答案 0 :(得分:7)
0xa0
正在编码R
中的另一种类型的空间(不间断空格),而0x20
是空格。
trimws
会搜索空格或制表符或换行符或回车符(由[ \t\r\n]+
表示),但不会搜索非中断空格,因此无法使用。
您可以使用sub
(以抑制前导或尾随空格)或gsub
(以抑制尾随和前导空格)来删除任何类型的尾随或前导空格(包括由0xa0
):
sub("^\\s+", "", x)
[1] "11.132592"
用于删除前导和尾随空格:
gsub("(^\\s+)|(\\s+$)", "", x)
答案 1 :(得分:3)
一种可能的解决方案是用正确的空格替换错误编码的空格:
trimws(rawToChar(replace(x1, x1 == as.raw(0xa0), as.raw(0x20))))
给出:
[1] "11.132592"
要转换为数字,只需将上面的代码包裹在as.numeric
。
使用过的数据:
x1 <- as.raw(c(0xa0, 0x31, 0x31, 0x2e, 0x31, 0x33, 0x32, 0x35, 0x39, 0x32))