保存csv字符文件时丢失数据

时间:2019-05-08 15:13:55

标签: r csv character

我有一个非常愚蠢的问题,使我失去了几个小时,因此我将其发布在这里。

我的数据看起来像这样

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)

我想删除“流”中具有字母的行,同时保留其余部分。

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

这种方法符合我的预期。 一旦我从流程中删除字母并保存数据csv,稍后就会出现问题。

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

一旦我重新上传我的数据,这将彻底改变。由于数据已存储为数字

,所以数字前面的所有0都丢失了
 df2<- import("df.csv")

我也尝试过write.csv2(df, "df.csv"),但结果没有改变。 如果我将其保存在dta中,则数据工作会重新上传一次,但我想保存在csv中

有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:3)

您遇到的问题不是csv的编写方式,而是读回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

答案 1 :(得分:2)

您可以使用RewriteRule ^resources/pages/forums/topic/(.*)$ resources/pages/forums/topic/index.php?topic_id=$1 [NC,L]中的read_csv()。它具有readr参数,但是即使具有默认值,它也可以满足您的要求。

col_types