data.table::merge如何避免编码警告?

6

使用data.tablemerge函数时,我遇到了编码警告。我的步骤如下:

  1. 创建第一个data.table
  2. 使用merge更新此data.table

但是当我调用merge时,会出现以下警告:

Please ensure that character columns have identical encodings for joins.

我该如何告诉data.table所使用的编码方式?我知道可以使用suppressWarnings来解决警告问题,但我更倾向于以一种规范的方式进行修复。

以下代码是该警告的再现:

library(data.table)
options(stringsAsFactors=FALSE)
dt = data.table(text=c('é','à','s'),
                title='agstudy',hrefs='a')
setkeyv(dt,names(dt))  
dt.new = data.table(text=c('é','à','h','a'),
                    hrefs=c(rep('a',2),rep('aa',2)),
                    title=c(rep('agstudy',2),rep('new',2)))
setkeyv(dt.new,names(dt.new))
merge(dt.new,dt,all=TRUE)

Warning messages:
1: In `[.data.table`(y, xkey, nomatch = ifelse(all.x, NA, 0), allow.cartesian = allow.cartesian) :
  Encoding of character column 'text' in X is different from column 'text' in Y 
  in join X[Y]. Joins are not implemented yet for non-identical character encodings 
  and therefore likely to contain unexpected results for those entries. 
  Please ensure that character columns have identical encodings for joins.

编辑 添加一些会话信息:

sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
[1] data.table_1.8.11

EDIT2 添加一些背景信息

在某些抓取操作之后,我的data.table是通过设置编码为UTF-8来创建的(使用htmlParse(...,encoding='UTF-8')),然后我使用抓取到的文本创建了这个data.table。


我没有警告。Encoding(dt$text)给你什么结果?我得到的是"unknown" "latin1" "latin1",我的脚本是用RStudio保存的UTF-8编码。 - Victorp
抱歉,我运行了你的代码,但是没有收到任何警告。编辑:我和Victorp具有相同的特征。 - Wave
data.table版本1.8.10,R版本3.1.0 - Wave
2
我也可以重现这个问题。问题似乎在于 Encoding(dt[[1]])[1] "latin1" "latin1" "unknown",即存在混合编码。但是根据文档:“ASCII字符串永远不会被标记为已声明的编码,因为它们在所有支持的编码中的表示都是相同的。”所以,我看不到避免警告的方法。 - Roland
这很奇怪。在我的Win7系统上,Encoding("é") 返回 [1] "latin1" - Roland
显示剩余5条评论
2个回答

3
警告是由于您的字符向量中混合了多种编码方式。 ASCII 字符的编码方式为“未知”,而其他字符可能是“latin1”编码。
使用以下方法将所有编码转换为“未知”:
dt[, names(dt) := lapply(.SD, function(x) {if (is.character(x)) Encoding(x) <- "unknown"; x})]

如果您对第二个DT执行相同的操作,则可以避免警告。
请注意,您正在使用开发版本。行为可能很快发生变化。

嗯,不太对。当字符是ascii时,不应该发生这种情况。至少我记得是这样的。如果存在非ASCII编码但同时具有“正确”的和“未知”的编码,则应该发出警告。 - Arun
@Arun 不,运行问题中的代码。所有非ASCII字符具有相同的编码(在Windows上为latin1)。只有ASCII字符具有不同的编码(未知)。 - Roland
也许不应该有警告(我同意)。但是现在有警告。 - Roland

2
编码问题已在v1.9.7(当前开发版)中得到解决。请参阅发布说明,错误修复#23。这应该按预期工作,不需要进行任何警告或编码转换。如果有问题,请报告。
require(data.table) # v1.9.7+
dt = data.table(text=c('é','à','s'), title='agstudy',hrefs='a')
dt.new = data.table(text=c('é','à','h','a'), hrefs=c(rep('a',2),rep('aa',2)), title=c(rep('agstudy',2),rep('new',2)))

merge(dt.new, dt, all=TRUE)
#    text hrefs   title
# 1:    a    aa     new
# 2:    h    aa     new
# 3:    s     a agstudy
# 4:    à     a agstudy
# 5:    é     a agstudy

merge(dt.new, dt, all=TRUE, by=c("text", "title"))
#    text   title hrefs.x hrefs.y
# 1:    a     new      aa      NA
# 2:    h     new      aa      NA
# 3:    s agstudy      NA       a
# 4:    à agstudy       a       a
# 5:    é agstudy       a       a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接