2014-02-27 3 views
6

Mit mergedata.table bekomme ich eine Codierung Warnungen. Mein Prozess ist als Gefährte:data.table :: merge Wie vermeidet man die Codierung von Warnungen mit Merge?

  1. Ich bin ein erstes data.table
  2. Schaffung ich diesen data.table aktualisieren mit merge.

Aber ich, wenn ich merge nennen bekomme ich diese Warnung:

Please ensure that character columns have identical encodings for joins. 

Wie kann ich data.table der Codierung verwendet sagen? Ich weiß, dass ich Warnung mit suppressWarnings entfernen kann, aber ich ziehe es vor, dies seit sauber zu beheben.

Dies gibt den warining:

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 einige Sitzungsinformationen hinzufügen:

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

EDIT2 einige Kontext hinzufügen

Meine data.table nach einiger Schaben erstellt wo ich die Codierung auf UTF-8 mit htmlParse (..., e ncoding = 'UTF-8'), dann erstelle ich die data.table mit dem Scraped Text.

+0

Ich habe keine Warnung. Was gibt dir 'Encoding (dt $ text)'? Ich habe '" unbekannt "" latin1 "" latin1 "', mein Skript ist in UTF-8 mit RStudio gespeichert. – Victorp

+0

Es tut mir leid, ich habe Ihren Code ausgeführt, aber ich erhalte keine Warnung. edit: Ich habe die gleichen Eigenschaften wie Victorp – Wave

+0

Ok ich verwendet data.table_1.8.10. Mit data.table_1.8.11 habe ich die Warnung. – Victorp

Antwort

3

Die Warnung resultiert aus einer Mischung von Codierungen in Ihren Zeichenvektoren. Die ASCII-Zeichen haben die Codierung "unbekannt", andere sind wahrscheinlich "latin1".

verwenden alle Kodierungen unbekannt konvertieren:

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

Wenn Sie das gleiche für das zweite DT tun, können Sie die Warnung vermeiden.

Beachten Sie, dass Sie eine Entwicklungsversion verwenden. Das Verhalten könnte sich bald ändern.

+0

Hm, nicht ganz. Es sollte nicht passieren, wenn die Charaktere 'Ascii' sind. Zumindest erinnere ich mich daran. Wenn Nicht-ASCII-Codierungen vorhanden sind, aber sowohl "richtige" als auch "unbekannte" Codierungen haben, dann sollte eine Warnung ausgegeben werden. – Arun

+0

@Arun Nein, führen Sie den Code aus der Frage aus. Alle nicht-ASCII-Zeichen haben die gleiche Codierung (latin1 in Windows). Nur ASCII-Zeichen haben eine andere Codierung (unbekannt). – Roland

+0

Vielleicht sollte es keine Warnungen geben (stimme zu). Aber es gibt Warnungen. – Roland

2

Die Codierungsprobleme sind in v1.9.7 (aktuelle Entwicklung) behoben. Siehe ReleaseNotes, Bug Fixes #23. Dies sollte wie beabsichtigt funktionieren, ohne dass Warnungen oder die Notwendigkeit zur Konvertierung von Kodierungen erforderlich sind. Bitte melden Sie sich zurück, wenn dies nicht der Fall ist.

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