首页 文章

合并因子与data.table中的非因素会导致意外结果

提问于
浏览
3

通过公共列合并两个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

咕嘟咕嘟 . Value 观是错误的 . 西欧= 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

1 回答

  • 0

    回答关闭未决问题 .
    与字符因子变量合并相关的问题#499已得到修复 . OP代码中的问题不再可以在最新版本的data.table上重现 .

相关问题