首页 > 解决方案 > data.table 包(或其 fread() 函数)与汉字的行为不一致

问题描述

与 争吵我的数据时data.table,我总是收到如下错误:

Error in `[.data.table`(dt1, , sum(持续时间 < as.ITime("04:00:00")), by = 年月) : 
  object '持续时间' not found

最后,我发现这可能与我使用fread(). 这是MWE:


方法 1 - 从脚本加载数据

dt1 <- fread("
活动类别,持续时间,开始时间,结束时间,备注,Tags
活动一,00:08:00,2019-11-0719:39:00,2019-11-0719:47:00,故人具鸡黍,
活动二,00:44:00,2019-08-2408:00:00,2019-08-2408:45:00,邀我至田家,
活动三,00:41:00,2019-07-2911:26:00,2019-07-2912:07:00,绿树村边合,
活动四,00:37:00,2019-12-2816:49:00,2019-12-2817:27:00,青山郭外斜,孟浩然
活动三,01:15:00,2019-12-2613:45:00,2019-12-2615:00:00,,
活动五,00:20:00,2019-10-3107:36:00,2019-10-3107:57:00,开轩面场圃,
活动六,00:31:00,2019-07-2018:24:00,2019-07-2018:55:00,把酒话桑麻,李白
活动四,00:31:00,2019-09-0109:09:00,2019-09-0109:41:00,待到重阳日,
活动七,01:23:00,2019-09-2121:06:00,2019-09-2122:30:00,,杜甫
活动三,00:54:00,2019-07-1018:09:00,2019-07-1019:04:00,还来就菊花,
")


dt1[, 持续时间 := as.ITime(持续时间)
   ][, 开始时间 := as.POSIXct(开始时间, format = "%Y-%m-%d %H:%M")
   ][, 结束时间 := as.POSIXct(结束时间, format = "%Y-%m-%d %H:%M")
   ][, 年月 := format(开始时间, "%Y年%m月")]


dt1[, sum(持续时间 < as.ITime("04:00:00")), by = 年月]

一切正常,输出是

##          年月 V1
## 1: 2019年11月  1
## 2: 2019年08月  1
## 3: 2019年07月  3
## 4: 2019年12月  2
## 5: 2019年10月  1
## 6: 2019年09月  2

方法 2 - 从文件中加载数据

foo.csv只是脚本数据的复制粘贴版本。

dt2 <- fread(file = "foo.csv", encoding = "UTF-8")

dt2[, 持续时间 := as.ITime(持续时间)
   ][, 开始时间 := as.POSIXct(开始时间, format = "%Y-%m-%d %H:%M")
   ][, 结束时间 := as.POSIXct(结束时间, format = "%Y-%m-%d %H:%M")
   ][, 年月 := format(开始时间, "%Y年%m月")]

dt2[, sum(持续时间 < as.ITime("04:00:00")), by = 年月]

但是,这次我收到上面提到的错误

Error in `[.data.table`(dt2, , sum(持续时间 < as.ITime("04:00:00")), by = 年月) : 
  object '持续时间' not found

更奇怪

> identical(dt1, dt2)
[1] TRUE

顺便说一句,如果数据中没有汉字,这两种方法都有效。随意尝试这个

Type,duration,start,end,comment,Tags
Type1,00:08:00,2019-11-0719:39:00,2019-11-0719:47:00,buljflajfa,
Type2,00:44:00,2019-08-2408:00:00,2019-08-2408:45:00,jljdfajfla,
Type3,00:41:00,2019-07-2911:26:00,2019-07-2912:07:00,kjlfjaljflakjf,
Type4,00:37:00,2019-12-2816:49:00,2019-12-2817:27:00,sgsfgfsgfgs,fgcs
Type3,01:15:00,2019-12-2613:45:00,2019-12-2615:00:00,,
Type5,00:20:00,2019-10-3107:36:00,2019-10-3107:57:00,scgvrsf,
Type6,00:31:00,2019-07-2018:24:00,2019-07-2018:55:00,tbjfcc,
Type4,00:31:00,2019-09-0109:09:00,2019-09-0109:41:00,cgvsdhc,
Type7,01:23:00,2019-09-2121:06:00,2019-09-2122:30:00,,dgd
Type3,00:54:00,2019-07-1018:09:00,2019-07-1019:04:00,fcsdfdgc,

先谢谢了~


> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936    

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

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

loaded via a namespace (and not attached):
 [1] compiler_3.6.0   rsconnect_0.8.16 htmltools_0.4.0  tools_3.6.0      yaml_2.2.0       Rcpp_1.0.3      
 [7] rmarkdown_2.1    knitr_1.27       digest_0.6.23    xfun_0.12        packrat_0.5.0    rlang_0.4.3     
[13] evaluate_0.14

标签: rdata.table

解决方案


推荐阅读