【问题标题】:Losing data while saving csv character file保存 csv 字符文件时丢失数据
【发布时间】:2019-05-08 15:13:55
【问题描述】:

我有一个非常愚蠢的问题,让我浪费了几个小时,因此我想把它贴在这里。

我的数据看起来像这样

df<- data.frame("Reporter" = c("USA", "USA", "USA", "USA", 
"Africa","Africa", "Africa","Africa"), 
"Partner" = c("Africa", "Africa", "EU", "EU", 
"USA", "USA", "EU", "EU"),
"Year" = c(1970, 1980, 1970, 1980, 1970, 1980, 
1970, 1980), 
"Flow" = c("001", "00", "1", "112", "0", "2", "23", "TOT"),
"Val" = runif(8, min=0, max=100), stringsAsFactors 
= FALSE)     

Flow 是一个包含字符和数字的字符变量。这些是变量“Val”的标识符

class(df$Flow)

我想删除“Flow”中包含字母的行,而保留其余行。

df <- df %>% filter(Flow != "TOT")

这种方法按我的预期工作。 一旦我从流中删除字母并将我的数据保存为 csv,问题就会出现。

 write.csv(df, "df.csv")

一旦我重新上传我的数据,这已经彻底改变了。由于数据已存储为数字,因此数字前面的所有 0 都已丢失

 df2<- import("df.csv")

我也试过write.csv2(df, "df.csv"),但结果没有改变。 如果我改为保存在 dta 中,数据一旦重新上传就可以工作,但我想保存在 csv 中

有谁知道我做错了什么?

【问题讨论】:

  • 这里使用import()的原因是什么?我看到使用read.csv() 的行为相同,据我所知,最简单的解决方案是在read.csv() 之类的范围内定义colClasses,以便将此列作为字符导入。这里重要的是,您在保存数据时并没有做错任何事情,而是在您再次读取数据时出现问题。
  • R write dataframe column to csv having leading zeroes 的可能副本,尽管@Alessandro 问题的答案在这里效率更高。

标签: r csv character


【解决方案1】:

您遇到的问题不是 csv 是如何写入的,而是它是如何被读回的。如果您在文本编辑器中查看该文件,您应该会看到前导零仍然存在。

在基础R 中,您可以指定列的类,这将防止前导零被丢弃:

> (df2 <- read.csv('df.csv', colClasses = c(Flow = 'character')))
  X Reporter Partner Year Flow       Val
1 1      USA  Africa 1970  001 87.582979
2 2      USA  Africa 1980   00  1.908992
3 3      USA      EU 1970    1 41.421509
4 4      USA      EU 1980  112 59.110781
5 5   Africa     USA 1970    0 27.277206
6 6   Africa     USA 1980    2 29.184184
7 7   Africa      EU 1970   23 37.417494

【讨论】:

  • 感谢这可行,问题是当我使用原始数据集时,我收到一条错误消息 'Error in read_csv("@@experiment.csv", colClasses = c('Commodity Description' = "character")) : 未使用的参数 (colClasses = c('Commodity Description' = "character")) 你知道它可能是什么原因吗?
  • @Alessandro 函数read_csv 来自tidyverse 包readr,参数名称与read.csv 不同。你可能想要col_types,而不是colClasses
  • 是的,最后我解决了这个问题:read_csv("df.csv", col_types = cols(.default = col_guess(), "Flow" = "c"))
【解决方案2】:

您可以从readr 使用read_csv()。它具有col_types 参数,但即使使用默认值,它也会满足您的需求。

df <- read.csv("df.csv")
class(df$Flow)
# [1] "integer"

df <- read_csv("df.csv")
class(df$Flow)
# [1] "character"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2019-08-31
    • 2012-01-14
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多