【问题标题】:data.table::merge How to avoid encoding warnings with merge?data.table::merge 如何通过合并避免编码警告?
【发布时间】:2014-02-27 14:34:32
【问题描述】:

使用mergedata.table 我收到编码警告。我的过程是同胞:

  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.

EDIT添加一些会话信息:

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 是在一些抓取之后创建的,我使用 htmlParse(...,encoding='UTF-8') 将编码设置为 UTF-8 然后我使用抓取的文本创建 data.table。

【问题讨论】:

  • 我没有警告。什么给你Encoding(dt$text)?我有"unknown" "latin1" "latin1",我的脚本使用 RStudio 保存在 UTF-8 中。
  • 对不起,我运行了您的代码,但没有收到任何警告。编辑:我和维克托普有同样的特征
  • 好的,我使用了 data.table_1.8.10。使用 data.table_1.8.11 我有警告。
  • data.table 版本 1.8.10,R 版本 3.1.0
  • 我也可以重现这个。问题似乎是Encoding(dt[[1]])[1] "latin1" "latin1" "unknown",即有混合编码。但根据文档:“ASCII 字符串永远不会用声明的编码标记,因为它们的表示在所有支持的编码中都是相同的。”所以,我看不到避免警告的方法。

标签: r encoding merge data.table


【解决方案1】:

警告是由字符向量中的混合编码引起的。 ascii 字符的编码为“未知”,但其他字符可能为“latin1”。

使用它来将所有编码转换为未知:

dt[, names(dt) := lapply(.SD, function(x) {if (is.character(x)) Encoding(x) <- "unknown"; x})]

如果对第二个 DT 执行相同操作,则可以避免警告。

请注意,您使用的是开发版本。这种行为可能很快就会改变。

【讨论】:

  • 嗯,不完全是。当字符为ascii 时不应发生这种情况。至少那是我记得的。如果存在非 ascii 编码但同时具有“正确”和“未知”编码,则应该有一个警告..
  • @Arun 不,运行问题中的代码。所有非 ascii 字符都具有相同的编码(Windows 上的 latin1)。只有 ascii 字符有不同的编码(未知)。
  • 也许不应该有警告(我同意)。但是有警告。
【解决方案2】:

编码问题已在 v1.9.7(当前开发)中得到修复。见ReleaseNotes, Bug Fixes #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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-02-07
    • 2016-12-25
    • 2021-02-04
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多