write_csv read_csv 第 1000 行后用科学计数法
write_csv read_csv with scientific notation after 1000th row
使用 write_csv() 将包含小整数条目(值小于 1000)和 "large" 条目(值大于或等于 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= ...,
指定为双精度或字符。 – CPak 3 小时前
使用@CPak 的建议将使您的代码更具可重现性,并且您的分析在长期 运行 中更具可预测性。这是 read_csv() 在阅读时吐出一条关于 colspec
的消息的主要原因(因此您可以复制并使用它)。复制它,修改它并告诉它使用不同的类型。
我刚刚安装了 readr 的开发版本:devtools::install_github("tidyverse/readr")
,所以现在我有 readr_1.2.0,NA
问题消失了。但是 "a" 列现在被 read_csv()
"guessed" 作为 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
使用 write_csv() 将包含小整数条目(值小于 1000)和 "large" 条目(值大于或等于 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= ...,
指定为双精度或字符。 – CPak 3 小时前
使用@CPak 的建议将使您的代码更具可重现性,并且您的分析在长期 运行 中更具可预测性。这是 read_csv() 在阅读时吐出一条关于 colspec
的消息的主要原因(因此您可以复制并使用它)。复制它,修改它并告诉它使用不同的类型。
我刚刚安装了 readr 的开发版本:devtools::install_github("tidyverse/readr")
,所以现在我有 readr_1.2.0,NA
问题消失了。但是 "a" 列现在被 read_csv()
"guessed" 作为 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