num

时间:2018-09-26 16:03:59

标签: r dataframe tidyverse readr

我生成了一个数据框,其中包含对38个变量的9829个观察值,并将其保存在write_csv中。

当使用read_csv将此数据帧加载为Shiny时,如果其值为浮点数,则将一列标记为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     

1 个答案:

答案 0 :(得分:3)

默认情况下,read_csv()查看前1,000行数据。我建议 R代表数据科学的this chapter 作为背景。该功能可能会猜错。例如,我曾经有一个数据集,其中gender列被标记为逻辑列,因为前1000行都是女性,并且函数将“ 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())