read.csv和fread对同一数据帧产生不同的结果

read.csv和fread对同一数据帧产生不同的结果,r,dataframe,fread,read.csv,R,Dataframe,Fread,Read.csv,fread函数from data.table包读取大型csv文件的速度比read.cvs函数快。但是从数据帧的输出可以看出,两个例程的“device\u id”列不同(见最后3位)。为什么?这些函数中是否有正确读取它们的参数?或者这是fread的正常行为?(但读取此数据文件的速度要快10倍) #读取文件 p头(p) 设备标识品牌设备型号 1 -8890648629457979392 2 1277779817574759168英里2 3 513747276142

fread
函数from data.table包读取大型csv文件的速度比
read.cvs
函数快。但是从数据帧的输出可以看出,两个例程的“device\u id”列不同(见最后3位)。为什么?这些函数中是否有正确读取它们的参数?或者这是fread的正常行为?(但读取此数据文件的速度要快10倍)

#读取文件
p头(p)
设备标识品牌设备型号
1 -8890648629457979392                  
2 1277779817574759168英里2
3 51374727614288105472星系S4
4 3669464369358936576糖
5-5019277647504317440星系注2
6 3238009352149731840大副

如果存在
位64
库,
fread
将自动使用它正确读取超过2^32-1的整数

read.csv
不能做到这一点,因此它会出现溢出

这在fread的第一段中提到:

类似于
read.table
,但更快更方便。自动检测所有控件,如
sep
colClasses
nrows
<代码>位64::整数64类型也会被检测并直接读取,而无需在转换之前读取为字符


您正在使用
integer64=“character”
选项,因此它们将被检测并作为字符读取。使用
read.table
,它们将不会被检测到,也不会作为字符读取。如果希望
read.csv
的行为类似,则需要使用
colClasses
参数指定导入期间要作为字符读取的列。当它被读入时,已经太晚了。溢出已导致信息丢失,
p$device\u id如果存在
bit64
库,
fread
将自动使用它正确读取超过2^32-1的整数

read.csv
不能做到这一点,因此它会出现溢出

这在fread的第一段中提到:

类似于
read.table
,但更快更方便。自动检测所有控件,如
sep
colClasses
nrows
<代码>位64::整数64
类型也会被检测并直接读取,而无需在转换之前读取为字符


您正在使用
integer64=“character”
选项,因此它们将被检测并作为字符读取。使用
read.table
,它们将不会被检测到,也不会作为字符读取。如果希望
read.csv
的行为类似,则需要使用
colClasses
参数指定导入期间要作为字符读取的列。当它被读入时,已经太晚了。溢出已经导致信息丢失,
p$device_id像teger一样优雅地讨论了
read.csv
函数在读取64位数字时有一个限制。与
fread
类似,如果
numbers
参数定义为“no.loss”
read.cvs
也可以工作。感谢所有对此问题的贡献者

p<-read.csv("C:\\Users\\Documents\\Data\\device.csv",sep=",",encoding="UTF-8", numerals="no.loss" )

> head(p)
              device_id      phone_brand                     device_model
1: -8890648629457979026 <U+5C0F><U+7C73>                 <U+7EA2><U+7C73>
2:  1277779817574759137 <U+5C0F><U+7C73>                             MI 2
3:  5137427614288105724 <U+4E09><U+661F>                        Galaxy S4
4:  3669464369358936369            SUGAR <U+65F6><U+5C1A><U+624B><U+673A>
5: -5019277647504317457 <U+4E09><U+661F>                    Galaxy Note 2
6:  3238009352149731868 <U+534E><U+4E3A>                             Mate
p头(p)
设备\u id手机\u品牌设备\u型号
1: -8890648629457979026                  
2:1277779817574759137英里2
3:51374288105724星系S4
4:3669464369358936369糖
5:-5019277647504317457银河注2
6:3238009352149731868大副

像teger优雅地讨论的那样,
read.csv
函数在读取64位数字时有一个限制。与
fread
类似,如果
numbers
参数定义为“no.loss”
read.cvs
也可以工作。感谢所有对此问题的贡献者

p<-read.csv("C:\\Users\\Documents\\Data\\device.csv",sep=",",encoding="UTF-8", numerals="no.loss" )

> head(p)
              device_id      phone_brand                     device_model
1: -8890648629457979026 <U+5C0F><U+7C73>                 <U+7EA2><U+7C73>
2:  1277779817574759137 <U+5C0F><U+7C73>                             MI 2
3:  5137427614288105724 <U+4E09><U+661F>                        Galaxy S4
4:  3669464369358936369            SUGAR <U+65F6><U+5C1A><U+624B><U+673A>
5: -5019277647504317457 <U+4E09><U+661F>                    Galaxy Note 2
6:  3238009352149731868 <U+534E><U+4E3A>                             Mate
p头(p)
设备\u id手机\u品牌设备\u型号
1: -8890648629457979026                  
2:1277779817574759137英里2
3:51374288105724星系S4
4:3669464369358936369糖
5:-5019277647504317457银河注2
6:3238009352149731868大副

我在谷歌上搜索了这些代码,似乎它们是一些汉字的Unicode。您是否正在尝试导入中国品牌和设备?请尝试使用
str()
或其他内容显示每个列的
class()
。文件中实际包含的值是多少?如果你能提供一个合适的解决方案,帮助会更容易。在这两种情况下,您可能都希望强制设备_id为字符值。它可能是带有
read.csv
的数字。正如@MrFlick所写,请提供文件以供检查。此外,如果您希望提高编码速度并更好地控制编码,您可能应该尝试
readr::read_csv
。我添加了由这两个函数创建的data.frames结构(见上文)。我不知道如何为数据附加文件。是的,“品牌”一栏是中文的。但这无关紧要。重要的是,尽管在这两种情况下,设备id属于同一类别:因子,但最左边3位的设备id值之间的差异。csv文件中的第一行是“-88906486294579026,小米,红米" i、 例如,“fread”读取文件正确,但“read.csv”读取错误。“readr::read_csv”将设备id转换为双精度(例如-8.890649e+18而不是-8890648629457979026),我猜您的设备id超过了R可以表示的最大有效位数,因此
read.csv
通过将其表示为flo而丢失信息