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

时间:2014-02-27 14:34:33

标签: r encoding merge data.table

使用merge data.table我收到编码警告。我的过程是同伴:

  1. 我正在创建第一个data.table
  2. 我使用merge更新此data.table。
  3. 但是当我打电话给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是在一些抓取之后创建的,我使用htmlParse(...,encoding ='UTF-8')将编码设置为UTF-8然后我使用抓取的文本创建data.table

2 个答案:

答案 0 :(得分:3)

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

使用此选项可将所有编码转换为未知:

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

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

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

答案 1 :(得分: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