如何避免:read.table 截断以 0 开头的数值

Posted

技术标签:

【中文标题】如何避免:read.table 截断以 0 开头的数值【英文标题】:How to avoid: read.table truncates numeric values beginning with 0 【发布时间】:2013-01-29 01:18:01 【问题描述】:

我想用read.table() 在 R 中导入一个表(.txt 文件)。我表中的一列是一个包含九个数字的 ID - 一些 ID 以 0 开头,其他以 1 或 2 开头。

R 会截断第一个 0(012345678 变为 12345678),这会导致在使用此 ID 合并另一个表时出现问题。

谁能给我一个提示如何解决这个问题?

【问题讨论】:

【参考方案1】:

正如 Ben 的回答中所说,colClasses 是更简单的方法。这是一个例子:

read.table(text = 'col1 col2
           0012 0001245',
           head=T,
           colClasses=c('character','numeric'))

  col1 col2
1 0012 1245      ## col1 keep 00 but not col2

【讨论】:

酷我不知道 colClasses 奇怪如何设置 as.is=T 对我不起作用。【参考方案2】:

这是一个基于条件向行添加前导零的 for 循环。虽然这是一个事后解决方案(在阅读表格后添加前导 0),但它对我有用,所以我想分享一下:

我们以一列邮政编码为例。所有值都应包含 5 位数字(例如 01234),但 R 会删除前导零(因此 '01234' 变为 '1234')。您可以使用此代码向所有仅包含 4 个字符的单元格添加尾随零:

for (i in 1:nrow(df))
  if(nchar(df$zipCode[i])<5)
    df$zipCode[i]<- paste0('0',df$zipCode[i])
  

【讨论】:

【参考方案3】:

一个可重现的例子会很好,但是:使用read.table()colClasses 参数来指定您希望将此列读取为character 变量,而不是numeric。或者在读入它们后将它们重新放入character 变量中,使用sprintf 用前导零填充数字。 (前者可能更容易。)

【讨论】:

以上是关于如何避免:read.table 截断以 0 开头的数值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby 聚合以截断最早日期而不是最旧日期

Sed如果在添加文件时以“ v”开头,则它会截断第一个字符

如何避免使用 <canvas> 旋转的图像截断?

使用 Spring 的 @Value 注释插入时如何避免截断前导零数字?

从 CSV 复制到访问时,避免数字被截断

.NET实现大量数据导出excel,避免被截断