使用fread加载数据表后无法识别的列名

时间:2014-04-22 02:01:32

标签: r data.table

我按照常规方式加载fread数据表。这些文件有大约2M的记录,并以制表符分隔。

加载成功。到目前为止,我可以打印表格的头部和列名称。

但是,更改第一列的名称或将其设置为键失败会导致无法找到列名称。我确信列名中没有拼写错误,没有标题或尾随空格,我尝试了多次复制/粘贴和重新输入。我可以更改任何其他列的名称。

第一列是长整数id,所以我不得不加载bit64包以摆脱'fread'中的警告,但它似乎没有帮助。这是一个线索吗?

有谁知道可能导致这种症状的原因是什么?如何调试?

我在Windows 64上使用R 3.1.0,所有软件包的最新版本。

编辑:更多详情

数据加载命令:

txnData <- fread(txnInDataPathFileName, header=TRUE, sep="\t", na.strings="NA")

列名:

colnames(txnData)
 [1] "txn_ext_id"  "txn_desc"       "txn_type_id"    "site_id"        "date_id"        "device_id"      "cust_id"       
 [8] "empl_id"        "txn_start_time" "txn_end_time"   "total_sales"    "total_units"    "gross_margin"

重命名列失败(setkey也是如此):

setnames(txnData, "txn_ext_id", "txnId")
Error in setnames(txnData, "txn_ext_id", "txnId") : 
  Items of 'old' not found in column names: txn_ext_id

最后请求的dput命令:

dput(head(txnData))
structure(list(`txn_ext_id` = structure(c(4.88536962440272e-311, 
1.10971996159584e-311, 9.9460266389845e-312, 1.0227644072435e-311, 
1.10329710699982e-311, 1.01930594588518e-311), class = "integer64"), 
    txn_desc = c("checkout transaction", "checkout transaction", 
    "checkout transaction", "checkout transaction", "checkout transaction", 
    "checkout transaction"), txn_type_id = c(0L, 0L, 0L, 0L, 
    0L, 0L), site_id = c(982L, 982L, 982L, 982L, 982L, 982L), 
    date_id = c("2012-12-24", "2013-11-27", "2013-04-08", "2013-06-04", 
    "2013-11-14", "2013-05-28"), device_id = c(8L, 7L, 8L, 53L, 
    8L, 5L), cust_id = structure(c(2.02600292130833e-313, 2.02572944866119e-313, 
    2.02583815970388e-313, 2.02580527009968e-313, 2.02568405005593e-313, 
    2.02736582767668e-313), class = "integer64"), empl_id = c("?", 
    "?", "?", "?", "?", "?"), txn_start_time = c("2012-12-24T08:35:56", 
    "2013-11-27T12:43:30", "2013-04-08T11:48:29", "2013-06-04T15:27:47", 
    "2013-11-14T12:57:38", "2013-05-28T11:03:21"), txn_end_time = c("2012-12-24T08:38:00", 
    "2013-11-27T12:47:00", "2013-04-08T11:49:00", "2013-06-04T15:35:00", 
    "2013-11-14T13:00:00", "2013-05-28T11:05:00"), total_sales = c(48.86, 
    69.7, 8.53, 33.46, 39.19, 35.56), total_units = c(12L, 44L, 
    3L, 4L, 14L, 17L), gross_margin = c(0, 0, 0, 0, 0, 0)), .Names = c("txn_ext_id", 
"txn_desc", "txn_type_id", "site_id", "date_id", "device_id", 
"cust_id", "empl_id", "txn_start_time", "txn_end_time", "total_sales", 
"total_units", "gross_margin"), class = c("data.table", "data.frame"
), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x00000000002c0788>)

1 个答案:

答案 0 :(得分:3)

隐藏的角色是 Byte Order Mark (BOM) ,当您有机会看到它时显示为。您原则上可以在ANSI显示模式下设置的编辑器中看到它 - 我不能在Notepad ++中!在R中,打印数据表的头部确实使用RStudio显示它,但它没有使用我默认使用的Eclipse StatET显示它,解释了为什么我没有立即注意到它。

请参阅以下链接。如何摆脱BOM字符:SO1SO2yiiframework

我在Notepad ++中加载了我的文件,编码 - &gt;转换为没有BOM的UTF-8,保存,这个BOM字符消失了,一切都很顺利。

在不触及文件的情况下解决此问题的纯R解决方案是在重命名命令中包含BOM字符作为前缀:setnames(dataTable, "firstColumnName", "firstColumnName")。这在RStudio工作,我想也可以在R控制台中工作。但是,它在Eclipse-StatET中工作,因为在弄乱数据表访问时BOM表字符仍然隐藏:第一列无法使用或不使用名称中的BOM前缀{{1}无论如何都失败了。