【问题标题】:How to make the long numbers not shown scientific mode in data.table in R? [duplicate]如何在 R 的 data.table 中使长数字不显示科学模式? [复制]
【发布时间】:2017-08-09 16:45:03
【问题描述】:

我在一个文件夹中有几个 .csv 文件。我想用命令把它们都读一遍

library(data.table)
path <-path
list <-  list.files(path,pattern="*.csv")
files <- paste(path,list,sep='/')
DT <- do.call(rbind, lapply(files, fread))

但是,由于第一列是 12 位数字,因此 data.table 以科学数字的方式显示它,例如

5.43971221673e-313

我应该如何将所有科学数字转换为普通整数?

非常感谢!

第一次编辑: 使用命令后

options("scipen"=100, "digits"=12)

它仍然显示像

这样的数字
5.43971221673e-313

即使在我应用了命令之后

options(scipen=999)

它把号码还给我

0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543971221673

甚至543971221673也不是正确的数字,正确的应该是

110101001001

我正在使用 data.frame 尝试转换,它有效。

a <- read.csv(files)
a[,1] <- as.character(a[,1])

但我更喜欢使用 data.table 来加快速度。

谢谢你们!

【问题讨论】:

  • 请使用rbindlist(lapply(files, fread))do.call(rbind... 很慢。
  • @MattDowle 为什么当你读到这个数字时值会改变fread('110101001001\n')
  • 我在这里得到了答案Convenience features of fread。通过options(datatable.integer64="character")@Sathish
  • @YijiaoLiu 请发布您尝试过的演示并将输出作为单独的答案
  • @Sathish 非常感谢!

标签: r data.table


【解决方案1】:
options(scipen = 999)
data.table(a = c(1e15, 2e15))
#                   a
# 1: 1000000000000000
# 2: 2000000000000000

options(scipen = 4)
data.table(a = c(1e15, 2e15))
#        a
# 1: 1e+15
# 2: 2e+15

【讨论】:

  • 您好,谢谢,而是,它显示0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543971221678;和543971221678不是正确的号码,这应该是110101001002 跨度>
  • 出现那个长字符串,因为你关闭了科学记数法
  • 要将其更改回默认值,请使用scipen = 0
  • 根据您的问题中的数据,该值是正确的,即 5.43971221673e-313
  • @YijiaoLiu 是的,你是对的。
【解决方案2】:

这里的参考Convenience features of fread解决了这个问题(至少是暂时的)。

'fread 自动检测大整数 (> 2^31) 并从 bit64 包中将它们读取为 integer64 类型。 '

只需要

install.packages("bit64")

或者放

options(datatable.integer64="character")

在 data.table 之前,它可以工作。这个例子可以是

library(data.table)
path <-path
list <-  list.files(path,pattern="*.csv")
files <- paste(path,list,sep='/')
options(datatable.integer64="character")
DT <- rbindlist(lapply(files, fread))

感谢@Sathish,这是我第一次在这里问 R 问题!

【讨论】:

  • 您使用的是哪个版本的 data.table?我怀疑它低于 v1.10.2,其中包含新闻:When fread() or print() see integer64 columns are present, bit64's namespace is now automatically loaded for convenience.
  • @MattDowlei 正在使用 1.10.4 的 data.table,R 版本是 3.3.2。
  • 好的。是否出现了警告消息,要求您安装 bit64 软件包,是吗?不推荐设置options(datatable.integer64="character"),除非你真的想要这样的数字作为字符。请删除该选项,检查您是否看到未安装 bit64 软件包的警告,然后安装 bit64 并重试。
  • 我刚刚发现,如果您没有安装bit64,则由于该部分代码中的错误而不会发生预期的警告。我刚刚修复了它 here 。对此感到抱歉。
  • @MattDowleHi Matt 这些天我忙于数据清理工作,我尝试了一些包 bit64 但没有完全,非常感谢,因为我现在正在使用这个数据集来处理我的论文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-02-04
  • 2013-11-27
相关资源
最近更新 更多