使用data.table
的merge
,我收到编码警告。 我的过程是这样的:
- 我正在创建一个第一个数据表。
- 我使用
merge
更新此数据表。
但是当我打电话给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
编辑2 添加一些上下文
我的 data.table 是在经过一些抓取后创建的,我使用 htmlParse(...,encoding='UTF-8') 将编码设置为 UTF-8
,然后我正在使用抓取的文本创建 data.table。
警告是由字符向量中的混合编码引起的。ascii 字符的编码为"unknown",但其他字符可能是"latin1"。
使用此选项将所有编码转换为未知编码:
dt[, names(dt) := lapply(.SD, function(x) {if (is.character(x)) Encoding(x) <- "unknown"; x})]
如果对第二个 DT 执行相同的操作,则可以避免警告。
请注意,您使用的是开发版本。这种行为可能很快就会改变。
编码问题已在 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