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