3

2 つの data.table を共通の列でマージすると、1 つの data.table ではマージ列が要因であり、もう 1 つの data.table ではそうではありませんが、予期しない結果が生じます。警告やエラーはスローされず、問題は関連する基礎となる data.tables に奇妙な影響を及ぼします。

require(data.table)
##Create two tiny data.tables.
data <- data.table(Country=c("Afghanistan","Albania","Western Europe"),Value =c(1,2,100))
data
## Country          Value
## 1    Afghanistan     1
## 2        Albania     2
## 3 Western Europe   100 

NatName <-data.table(Country =factor(c("Afghanistan","Albania")),code=c("AFG","ALB"))


NatName
##Country       code
##1 Afghanistan  AFG
##2     Albania  ALB

##Merge them together.
merge(data,NatName,by="Country",all.x=TRUE)

##       Country Value code
##1:          NA   100   NA
##2: Afghanistan     1  AFG
##3:     Albania     2  ALB

奇妙なことに、西ヨーロッパに何が起こったのですか? 合併は国の名前を殺しました。うーん、些細な不具合。しかし、待ってください。

##Lets try setting keys first.
setkey(data, Country)
setkey(NatName,Country)
merge(data,NatName,by="Country",all.x=TRUE)
##       Country Value code
##1:          NA   100   NA
##2: Afghanistan     1  AFG
##3:     Albania     2  ALB
##Same results.  But, lets look at our data.
data
##         Country Value
##1    Afghanistan   100
##2        Albania     1
##3 Western Europe     2

ゴクゴク。値が間違っています。西ヨーロッパ = 2 ではなく 100... 何かが元のデータ テーブルを変更しました。

もちろん、これはユーザー エラーから始まります。マージの場合、列は同じタイプである必要があります。read.csv を使用して読み取った CSV とデータ テーブルをマージしようとしたときに、これに遭遇しました。私は stringsAsFactor=FALSE を設定しなかったので、一方の DT にはもう一方の要素がありませんでした。

多分マージはチェックして警告するべきですか?興味のある方は、私のセッション情報をご覧ください。

sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2

loaded via a namespace (and not attached):
[1] plyr_1.8.1    Rcpp_0.11.2   reshape2_1.4  stringr_0.6.2 tools_3.1.1
4

1 に答える 1