write_csv read_csv с научной нотацией после 1000-й строки

Запись фрейма данных со смесью маленьких целочисленных записей (значение меньше 1000) и "больших" записей (значение 1000 или больше) в файл csv с помощью write_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)

Это ошибка, о которой следует сообщать?

2 ответа

Добавление двух ответов, как правильных, так и обоснования в виде сообщества Wiki.

У read_csv есть аргумент guess_max, который по умолчанию будет установлен в 1000. Таким образом, read_csv читает только первые 1000 записей, прежде чем пытаться выяснить, как должен анализироваться каждый столбец. Увеличение параметра gue_max, превышающее общее количество строк, должно решить проблему. - Мариус 4 часа назад

Вы также можете указать ,col_types= ..., как двойной или символ. - CPak 3 часа назад

Использование предложения @CPak сделает ваш код более воспроизводимым, а ваш анализ - более предсказуемым в долгосрочной перспективе. Это основная причина, по которой read_csv() выкладывает сообщение о colspec после прочтения (так что вы можете скопировать и использовать его). Скопируйте его, измените его и скажите, чтобы он использовал другой тип.

Я только что установил dev версию readr: devtools::install_github("tidyverse/readr"), так что теперь у меня есть readr_1.2.0, и NA проблема ушла Но столбец "а" "угадан" 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

Большое значение по-прежнему записывается как 1e3 write_csv()Однако, на мой взгляд, это не совсем окончательное решение.

$ tail -n3 tib.csv
#1
#1e3
#1
Другие вопросы по тегам