通过一个公共列合并两个 data.tables,其中一个 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
吞咽。价值观是错误的。西欧 = 100,而不是 2... 某些东西改变了我原来的数据表。
当然,这始于用户错误。对于合并,列的类型应该相同。当我尝试将数据表与使用 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