7

我意识到读取 .csv 文件会删除前导零,但对于我的某些文件,它会保留前导零,而无需我在 read.csv 中显式设置 colClasses。另一方面,让我感到困惑的是在其他情况下,它确实删除了前导零。所以我的问题是:在哪些情况下 read.csv 会删除前导零?

4

2 回答 2

9

、和相关函数将所有内容作为字符串读取read.csvread.table然后根据函数的参数(特别是colClasses,但也包括其他参数)和选项,然后函数将尝试“简化”列。如果足够多的列看起来是数字并且您没有告诉函数,那么它将把它转换为数字列,这将删除任何前导 0(以及小数点后的尾随 0)。如果列中的某些内容看起来不像数字,则它不会转换为数字,而是将其保留为字符或转换为因子,这将保留前导 0。该函数并不总是查看整个列来做出决定,因此对您来说可能很明显不是数字的内容可能仍会被转换。

最安全(也是最快)的方法是指定colClasses以便 R 不需要猜测(并且您不需要猜测 R 将猜测什么)。

于 2015-07-14T15:50:35.177 回答
3

基本上是手册中@GregSnow 答案的补充。

所有报价来自?read.csv

除非指定 colClasses,否则所有列都被读取为字符列,然后使用 type.convert 转换为逻辑、整数、数字、复数或(取决于原样)适当的因子。引号(默认情况下)在所有字段中都被解释,因此像“42”这样的一列值将产生一个整数列。

还:

数据列的数量是通过查看输入的前五行来确定的......

Suggestsread.csv查看前 5 行并猜测该列是否是numeric/integer从那里,否则保持它为character(并因此保持领先0)。

如果您仍然对更多细节感到好奇,我建议您检查其中的代码,edit(read.csv)其中的代码edit(read.table)很长,但会详细说明函数正在执行的每一步。

最后,顺便说一句,通常最好指定colClasses

如果将 colClasses 指定为六个原子向量类之一,则将使用更少的内存。在读取具有许多不同数值的列时尤其如此,因为将每个不同的值存储为字符串可能占用的内存是将其存储为整数的 14 倍。

虽然如果你真的关心内存使用/速度,你应该真的使用freadfromdata.table ; 即使这样,指定也会colClasses产生加速。

于 2015-07-14T15:58:00.643 回答