相关疑难解决方法(0)

为什么一些Unicode字符显示在矩阵中,而不是R中的数据帧?

至少在某些情况下,亚洲字符如果包含在a matrix或a中vector,则不可打印,但不包含在a中data.frame.这是一个例子

q<-'?'

q # Works
# [1] "?" 

matrix(q) # Works
#      [,1]
# [1,] "?"

q2<-data.frame(q,stringsAsFactors=FALSE) 
q2 # Does not work
#          q
# 1 <U+5929>

q2[1,] # Works again.
# [1] "?"
Run Code Online (Sandbox Code Playgroud)

显然,我的设备能够显示角色,但是当它在a中时data.frame,它不起作用.

做一些挖掘,我发现该print.data.frame函数format在每列上运行.事实证明,如果format.default直接运行,会出现同样的问题:

format(q)
# "<U+5929>"
Run Code Online (Sandbox Code Playgroud)

深入研究format.default,我发现它是format用C语言编写的.

在我进一步挖掘之前,我想知道其他人是否可以重现这种行为.是否有一些R配置允许我在data.frames中显示这些字符?

我的sessionInfo(),如果它有帮助:

R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Canada.1252  LC_CTYPE=English_Canada.1252   
[3] LC_MONETARY=English_Canada.1252 LC_NUMERIC=C                   
[5] …
Run Code Online (Sandbox Code Playgroud)

r

21
推荐指数
2
解决办法
3114
查看次数

从R写入UTF-8文件

虽然R似乎在内部很好地处理Unicode字符,但是我无法在R中输出具有这种UTF-8 Unicode字符的数据帧.有没有办法强迫这个?

data.frame(c("h?ersumian","?mettigan"))->test
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)

输出文本文件如下:

hiersumian <U+01E3>mettigan

我在Windows环境(Windows 7)中使用R 3.0.2版.

编辑


在答案中已经建议R正确地以UTF-8编写文件,问题在于我用来查看文件的软件.这里有一些代码,我在R中做所有事情.我正在用UTF-8编码的文本文件中读取,并且R正确读取它.然后R将文件写入UTF-8并再次读回,现在正确的Unicode字符消失了.

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
myinputfile[1,1]
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
myoutputfile[1,1]
Run Code Online (Sandbox Code Playgroud)

控制台输出:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
> myinputfile[1,1]
[1] h?ersumian
Levels: h?ersumian ?mettigan
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
> myoutputfile[1,1]
[1] <U+FEFF>hiersumian
Levels: <U+01E3>mettigan <U+FEFF>hiersumian
> 
Run Code Online (Sandbox Code Playgroud)

windows unicode r utf-8

19
推荐指数
1
解决办法
2万
查看次数

R中的UTF-8文件输出

我在Windows 7 64位上使用R 2.15.0.我想将unicode(CJK)文本输出到文件.

以下代码显示了发送到UTF-8文件连接上的Unicode字符如何不能正常工作(I):

rty <- file("test.txt",encoding="UTF-8")
write("?", file=rty)
close(rty)
rty <- file("test.txt",encoding="UTF-8")
scan(rty,what=character())
close(rty)
Run Code Online (Sandbox Code Playgroud)

如扫描输出所示:

Read 1 item 
[1] "<U+5728>"
Run Code Online (Sandbox Code Playgroud)

该文件不是用UTF字符本身编写的,而是某种符合ANSI标准的回退.我可以让它第一次正常工作(即使用其中包含"在"的文本文件),或者我可以使用一些额外的魔法将输出转换为Unicode,并使用正确的字符替换代码字符串吗?

谢谢.

[更多信息:相同的代码在Cygwin,R 2.14.2中正常运行,而Win7上的2.14.2也被破坏.这是在我的某个地方吗?]

unicode r cjk

11
推荐指数
3
解决办法
1万
查看次数

如何在R中读取utf-8格式的数据?

我的系统:win7 + R-3.0.2.

> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese 
(Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's        
republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936"
Run Code Online (Sandbox Code Playgroud)

在microsoft记事本中保存了两个具有相同内容的文件:一个保存为ansi格式,另一个保存为utf8格式.数据是M370马来西亚航空公司的死亡名称.或者您可以通过这种方式创建文件.

1)将数据复制到microsoft记事本中.

????,??,????
HuangTianhui,?,1948/05/28
???,?,1952/03/27
???,?,1994/12/09
Run Code Online (Sandbox Code Playgroud)

2)将其作为带有ansi格式的test.ansi保存在记事本中.
3)在记事本中将utf-8格式保存为test.utf8.

read.table("test.ansi",sep=",",header=TRUE)  #can work fine
read.table("test.utf8",sep=",",header=TRUE)  #can't work
Run Code Online (Sandbox Code Playgroud)

然后,我将编码设置为utf-8.

options(encoding="utf-8")
read.table("test.utf8",sep=",",header=TRUE,encoding="utf-8")


 In read.table("test.utf8", sep = ",",header=TRUE,encoding = "utf-8") :
invalid input found on input connection 'test.utf8'
Run Code Online (Sandbox Code Playgroud)

如何读取数据文件(test.utf8)?
在python中,它非常简单

rfile=open("g:\\test.utf8","r",encoding="utf-8").read()
rfile
'\ufeff????,??,????\n\nHuangTianhui,?,1948/05/28\n\n???,?,1952/03
/27\n\n???,?,1994/12/09'
rfile.replace("\n\n","\n").replace("\ufeff","").splitlines()
['????,??,????', 'HuangTianhui,?,1948/05/28', '???,?,1952/03/27',
 '???,?,1994/12/09']
Run Code Online (Sandbox Code Playgroud)

Python可以比R做得更好.

我像Sathish所说的那样,问题解决了一点,仍然保留了一些.
我发现当数据在data.frame中时,它无法正常显示,
当数据是一列data.frame时,它可以正常显示
,当数据是一行data.frame时,它就足够奇怪了,它无法正常显示.

在此输入图像描述

在此输入图像描述

r utf-8

9
推荐指数
1
解决办法
6万
查看次数

标签 统计

r ×4

unicode ×2

utf-8 ×2

cjk ×1

windows ×1