当是 num 时,列被错误地标记为 int

Column wrongly tagged as int when is num

我生成了一个包含 37 个变量的 9829 个观察值的数据框,并用 write_csv 保存了它。

当使用 read_csv 闪亮加载此数据帧时,当其值为浮点数时,一列被标记为 int,这会导致此列中的所有浮点值都设置为 NA。

经过仔细调查,问题似乎是该列中的前 ~4000 个观测值是 0,没有数字,这似乎是读取功能的问题。

此问题的快速解决方法是在保存前按引起问题的列对数据框进行降序排序。但这不是一个有效的解决方案,因为将来我可能会有不止一个专栏讨论这个问题。

问题:有没有办法设置write_csv以2位精度将所有项目写在浮动列中?或者自动修复问题

谢谢

编辑

library(tidyverse)

col1 <- c(c(0:5000), c(2.1,3.5))
df <- data.frame(col1)

write_csv(df, "./data_out/test/wrong_dataType_issue.csv")
df_read <- read_csv("./data_out/test/wrong_dataType_issue.csv")
summary(df_read)

 col1     
 Min.   :   0  
 1st Qu.:1250  
 Median :2500  
 Mean   :2500  
 3rd Qu.:3749  
 Max.   :4999  
 NA's   :7     

默认情况下,read_csv() 查看前 1,000 行数据。我建议 this chapter of R for Data Science 作为背景。函数可能会猜错。例如,我曾经有一个数据集,其中 gender 列被标记为逻辑列,因为前 1,000 行都是女性,函数将 "F" 解释为 "FALSE"。有解决这个问题的正确方法和快速方法。

快捷方式

read_csv() 有一个名为 guess_max 的参数,用于设置要探索的行数。您可以使用类似这样的方法来解决问题...

read_csv("my_data.csv", guess_max = 9829)

这会强制 read_csv() 函数在猜测列类型之前查看数据集中的每个值。它会解决你的问题,但它可能会在未来造成更多麻烦,特别是如果嵌入到基础数据可能发生变化的 Shiny 应用程序中。

正确的方法

read_csv() 可以轻松显式定义所有列的数据类型。如果您想确保列 age 始终被读取为数字,请使用类似以下内容...

read_csv("my_data.csv", col_types = cols(age = col_double())