r - 当列为 num 时,列被错误标记为 int

标签 r dataframe tidyverse readr

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

使用 read_csv 加载此数据框时,如果其值为 float ,则一列被标记为 int,这会导致该列中的所有浮点值都设置为 NA。

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

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

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

谢谢

编辑

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 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())

关于r - 当列为 num 时,列被错误标记为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52521985/

相关文章:

r - 如何在创建自己的函数时处理 NA

python - pyspark 数据框中所有列的总计数为零

python - 根据条件检索具有最高值的行

用 Tidyverse 替换 R 中的子集

r - 更改 corrplot.mixed 中的文本颜色

r - 更改多面 geom_boxplot 中的 mustache 定义

r - 测试 R 中是否设置了函数的参数

python - 如何将可变格式的字符串数据转换为日期时间?

r - R 中具有条件的聚合行

r - 使用 case_when 进行字符串匹配的多种模式