第1000行后写入带有科学记数法的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)

这是一个应该报告的错误吗?

最佳答案 添加两个答案,正确,以及社区Wiki的基本原理.

read_csv有一个参数guess_max,默认情况下会设置为1000.所以read_csv只读取前1000条记录,然后才弄清楚每列应该如何解析.将guess_max增加到大于总行数应解决问题. – 马里乌斯4小时前

您还可以将col_types = …指定为double或character. – CPak 3小时前

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

点赞