为什么使用fread函数将数据导入R会引起特殊的数据类型比较错误,从而导致进一步的过滤问题

问题描述 投票:0回答:1

我正在使用data.table :: fread导入具有750万行和56列的大型数据集。我为某些变量指定变量类,这些变量将使用colClasses参数作为字符读取。导入后数据看起来很好,并且列类正确创建。

但是,当我过滤数据时,开始出现问题。不幸的是,我无法在此处构建示例,因为我不知道到底是什么问题。

但是当我使用二进制逻辑过滤一些行时,基本上会发生错误。

下面的代码显示错误:

首先,'id'列被读取为字符,并且str / glimpse / class / mode均对其进行确认。那为什么会这样呢:

mydata[mydata$id == 01005845, year]
[1] 2015 2014 2013 2012

mydata[mydata$id == "01005845", year]
[1] 2011 2010 2009 2008 2007 2006 2005

为了进一步测试,我针对这些特定观察重新检查了数据类,这些数据仍显示为字符:

typeof(mydata[mydata$id == 01005845, id])
[1] "character"

glimpse(mydata[mydata$id == 01005845, id])
chr [1:4] "01005845" "01005845" "01005845" "01005845"

mydata[mydata$id == 01005845, id] == 01005845
TRUE TRUE TRUE TRUE

这对我来说没有任何意义,因为对于其他一些id来说,所有类型都是字符,我不会得到这个奇怪的结果。

全部是这个字符-整数比较不一致使我所有的分析混乱。我的过滤无法正常工作,并且输出受到严重影响。

感谢您的帮助。保重:)

r types data.table fread
1个回答
0
投票
如果您在控制台中键入01005845,则会得到

>01005845 #[1] 1005845

由于id列为字符,因此应使用

mydata[id == "01005845", year]

这个小例子演示了问题
library(data.table) df <- data.table(a = c('2011', '02011', '2011', '2012', '02011'), b = letters[1:5]) df[a == 02011, ] # a b #1: 2011 a #2: 2011 c df[a == "02011", ] # a b #1: 02011 b #2: 02011 e
© www.soinside.com 2019 - 2024. All rights reserved.