r语言 - 在第 1000 行之后用科学记数法write_csv read_csv


使用 write_csv(( 将混合包含小整数条目(值

小于 1000(和"大"条目(值 1000 或更大(的数据帧写入 csv 文件会混合科学和非科学条目。 如果前 1000 行是小值,但之后有一个大值,read_csv(( 似乎会与这种混合混淆,并为科学记数法输出 NA:

test_write_read <- function(small_value, 
                            n_fills, 
                            position, 
                            large_value) {
    tib             <- tibble(a = rep(small_value, n_fills))
    tib$a[position] <- large_value
    write_csv(tib, "tib.csv")
    tib             <- read_csv("tib.csv")
}

以下行没有任何问题:

tib <- test_write_read(small_value = 1, 
                       n_fills     = 1001, 
                       position    = 1000, #position <= 1000
                       large_value = 1000)
tib <- test_write_read(1, 1001, 1001, 999)
tib <- test_write_read(1000, 1001, 1000, 1)

但是,以下行执行:

tib <- test_write_read(small_value = 1, 
                       n_fills     = 1001, 
                       position    = 1001, #position > 1000
                       large_value = 1000)
tib <- test_write_read(1, 1002, 1001, 1000)
tib <- test_write_read(999, 1001, 1001, 1000)

典型输出:

problems(tib)
## A tibble: 1 x 5
#  row   col   expected               actual file
#  <int> <chr> <chr>                  <chr>  <chr>
#1 1001  a     no trailing characters e3     'tib.csv'
tib %>% tail(n = 3)
## A tibble: 3 x 1
#      a
#  <int>
#1   999
#2   999
#3    NA

csv 文件:

$ tail -n3 tib.csv
#999
#999
#1e3

我正在运行:

R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.3 LTS

使用 tidyverse_1.2.1(加载readr_1.1.1(

这是应该报告的错误吗?

添加两个答案,都是正确的,并且基本原理作为社区维基。

read_csv有一个参数guess_max,默认情况下将设置为 1000。因此,read_csv在尝试弄清楚应该如何解析每一列之前,只读取前 1000 条记录。将guess_max增加到大于总行数应该可以解决问题。– 马吕斯 4小时前

您还可以将,col_types= ...,指定为双精度或字符。 – CPak 3小时前

从长远来看,使用 @CPak 的建议将使您的代码更具可重复性,并且您的分析更具可预测性。这是 read_csv(( 在阅读时吐出有关colspec的消息的主要原因(因此您可以复制并使用它(。复制它,修改它并告诉它使用不同的类型。

我刚刚安装了 readr: devtools::install_github("tidyverse/readr") 的开发版本,所以现在我有了 readr_1.2.0,NA问题消失了。 但是列"a"现在被read_csv()"猜测"为dbl(无论其中是否有大整数(,而它之前被正确读取为int,所以如果我需要它作为int我仍然必须进行as.integer()转换。 至少现在它不会使我的代码崩溃。

tib <- test_write_read(1, 1002, 1001, 1000)
tib %>% tail(n = 3)
## A tibble: 6 x 1
#        a
#    <dbl>
#1    1.00
#2 1000
#3    1.00

不过,大值仍然被 write_csv() 写为 1e3,所以在我看来这不是一个最终的解决方案。

$ tail -n3 tib.csv
#1
#1e3
#1

相关内容

  • 没有找到相关文章

最新更新