我意识到阅读.csv文件会删除前导零,但对于我的一些文件,它会保留前导零,而无需在read.csv中显式设置colClass。另一方面,让我困惑的是,在其他情况下,它确实删除了前导零。所以我的问题是在哪些情况下read.csv删除前导零?
sigwle7e1#
read.csv、read.table和相关函数将所有内容作为字符串读取,然后根据函数的参数(特别是colClasses,还有其他参数)和选项,函数将尝试“简化”列。如果列中有足够多的地方看起来是数字,并且你没有告诉函数,否则它会将其转换为数字列,这将删除任何前导0(以及小数点后的尾随0)。如果列中有不像数字的东西,那么它不会转换为数字,而是将其保留为字符或转换为因子,这将保留前导0。该函数并不总是查看整个列来做出决定,因此对您来说可能很明显不是数值的内容仍然可以被转换。最安全(也是最快)的方法是指定colClasses,这样R就不需要猜测(你也不需要猜测R将要猜测什么)。
read.csv
read.table
colClasses
wydwbb8l2#
基本上是对@GregSnow答案的补充,来自手册。所有来自?read.csv的报价:除非指定了colClasses,否则所有列都被读取为字符列,然后使用type.convert转换为逻辑、整数、数字、复杂或适当的因子(取决于as.is)。引号(默认情况下)在所有字段中被解释,因此像“42”这样的值列将导致整数列。另外:数据列的数量是通过查看输入的前五行来确定的。建议read.csv查看前5行并猜测该列是否为numeric/integer,否则保持为character(从而保持前导0)。如果你仍然对更多的细节感兴趣,我建议你检查edit(read.csv)和edit(read.table)中的代码,这两个代码很长,但会详细说明函数的每一步。最后,顺便说一下,指定colClasses通常是一个很好的做法:如果colClasses被指定为六个原子向量类中的一个,则会使用更少的内存。这在阅读包含许多不同数值的列时尤其如此,因为将每个不同数值存储为字符串可能占用的内存是将其存储为整数的14倍。不过,如果你真的关心内存使用率/速度,你真的应该使用fread from data.table;即使如此,指定colClasses也会导致加速。
?read.csv
numeric
integer
character
0
edit(read.csv)
edit(read.table)
fread
data.table
2条答案
按热度按时间sigwle7e1#
read.csv
、read.table
和相关函数将所有内容作为字符串读取,然后根据函数的参数(特别是colClasses
,还有其他参数)和选项,函数将尝试“简化”列。如果列中有足够多的地方看起来是数字,并且你没有告诉函数,否则它会将其转换为数字列,这将删除任何前导0(以及小数点后的尾随0)。如果列中有不像数字的东西,那么它不会转换为数字,而是将其保留为字符或转换为因子,这将保留前导0。该函数并不总是查看整个列来做出决定,因此对您来说可能很明显不是数值的内容仍然可以被转换。最安全(也是最快)的方法是指定
colClasses
,这样R就不需要猜测(你也不需要猜测R将要猜测什么)。wydwbb8l2#
基本上是对@GregSnow答案的补充,来自手册。
所有来自
?read.csv
的报价:除非指定了colClasses,否则所有列都被读取为字符列,然后使用type.convert转换为逻辑、整数、数字、复杂或适当的因子(取决于as.is)。引号(默认情况下)在所有字段中被解释,因此像“42”这样的值列将导致整数列。
另外:
数据列的数量是通过查看输入的前五行来确定的。
建议
read.csv
查看前5行并猜测该列是否为numeric
/integer
,否则保持为character
(从而保持前导0
)。如果你仍然对更多的细节感兴趣,我建议你检查
edit(read.csv)
和edit(read.table)
中的代码,这两个代码很长,但会详细说明函数的每一步。最后,顺便说一下,指定
colClasses
通常是一个很好的做法:如果colClasses被指定为六个原子向量类中的一个,则会使用更少的内存。这在阅读包含许多不同数值的列时尤其如此,因为将每个不同数值存储为字符串可能占用的内存是将其存储为整数的14倍。
不过,如果你真的关心内存使用率/速度,你真的应该使用
fread
fromdata.table
;即使如此,指定colClasses
也会导致加速。