将带有前导零的数据框列写入CSV

6

我有一个表格,存储了不同长度的前缀...

ClusterTable[ClusterTable$FeatureIndex == "Prefix2",'FeatureIndex', 'FeatureValue')

这是表(ClusterTable)的一部分。

   FeatureIndex FeatureValue
80      Prefix2           80
81      Prefix2           81
30      Prefix2           30
70      Prefix2           70
51      Prefix2           51
84      Prefix2           84
01      Prefix2           01
63      Prefix2           63
28      Prefix2           28
26      Prefix2           26
65      Prefix2           65
75      Prefix2           75

我使用以下代码将数据写入csv文件:

write.csv(ClusterTable, file = "My_Clusters.csv")

特征值01丢失了其前导零。
我首先尝试将该列转换为字符。
ClusterTable$FeatureValue <- as.character(ClusterTable$FeatureValue)

我也尝试将其附加到一个空字符串中,以在写入文件之前将其转换为字符串。

ClusterTable$FeatureValue <- paste("",ClusterTable$FeatureValue)

此外,我在这个表中有各种长度的前缀,所以我不能使用固定长度的简单格式说明符。例如,表格还具有值001(Prefix3),0001(Prefix4)等。谢谢。

我找到了一个相关的问题: http://stackoverflow.com/questions/24043162/r-excel-leading-zeroes但是这个问题是关于读取数据的,而且长度是固定的。 - karx
它到底什么时候会失去这个“0”呢?我尝试使用R编写并打开“01”(作为字符),它可以正常工作。使用任何文本编辑器打开也应该没问题。 - statespace
在我的 CSV 文件中,我将该文件作为另一个程序的数据源。如果我打开并检查 CSV 文件,就会发现没有前导零。 - karx
1
@karx,你是在Excel中打开CSV文件吗?我认为Excel可能会尝试聪明地自动删除前导零。 - cdeterman
@cdeterman 你不知道我有多傻。非常感谢。 在我的文本编辑器中查看,哇啦! 每次在将CSV文件传递给下一个程序之前,我都会手动检查一遍。只是为了确保。谁知道过度谨慎会害了自己。 - karx
@karx,很高兴问题已经解决。我会将其发布为答案。 - cdeterman
7个回答

6

编辑:截至2021年8月5日再次测试,查找和替换方法不再有效。:(请使用“闪存填充”解决)

我知道这是一个老问题,但我偶然发现了一个解决方案,可以在Excel中打开.csv输出时保留前导零。在R中编写您的.csv之前,在每个值的前面添加一个撇号,如下所示:

vector <- sapply(vector, function(x) paste0("'", x))

当您在Excel中打开输出时,撇号将告诉Excel保留所有字符而不删除前导零。

较新的Excel版本:
由于查找和替换会删除撇号以及0(在较新的Excel版本中),另一种方法是添加一个列并使用“闪存填充”添加没有撇号的值。如果单元格中的值在格式上有所不同(例如,某些单元格中有多个数字),则应检查“闪存填充”的结果并根据需要进行调整。然后可以删除原来的列。

旧版Excel:
此时,您可以将该列格式设置为“文本”,然后执行查找和替换以删除撇号(也许可以为此制作宏)。


这对我没有起作用。在使用撇号替换后,前导零消失了。 - user17144
1
刚刚又尝试了一下,最新版本的Excel也无法正常工作。答案是6年前的,所以看起来Excel团队找到了更加烦人的方法。我建议你在这里不要使用Excel来检查数据或保留撇号。 - giraffehere

4
如果您只需要视觉效果,只需在编写csv文件之前添加一行代码,如下所示:
ClusterTable <- read.table(text="   FeatureIndex FeatureValue
80      Prefix2           80
           81      Prefix2           81
           30      Prefix2           30
           70      Prefix2           70
           51      Prefix2           51
           84      Prefix2           84
           01      Prefix2           01
           63      Prefix2           63
           28      Prefix2           28
           26      Prefix2           26
           65      Prefix2           65
           75      Prefix2           75",
                           colClasses=c("character","character"))

ClusterTable$FeatureValue <- paste0(ClusterTable$FeatureValue,"\t")

write.csv(ClusterTable,file="My_Clusters.csv")

它在值的末尾添加了一个字符,但在Excel中它是隐藏的。

我曾经陷入困境,试图使用data.frame解决这样一个问题,而paste0(variable, "\t")完美地解决了它。非常感谢你。 - Jorge Mendoza Ruiz

3

将文件保存为csv文件,但将扩展名改为txt。然后使用read.table并设置sep=","来读取:

write.csv(ClusterTable,file="My_Clusters.txt")
read.table(file=My_Clusters.txt, sep=",")

0
如果您想用Excel打开.csv文件,我建议您改为将数据写入Excel。不过,在此之前您需要对数据进行填充处理。
    library(openxlsx)
    library(dplyr)

    ClusterTable <- ClusterTable %>% 
     mutate(FeatureValue = as.character(FeatureValue),
     FeatureValue = str_pad(FeatureValue, 2, 'left', '0'))

    write.xlsx(ClusterTable, "Filename.xlsx")

0

这基本上是你从R导出数据时可以采取的路线。它取决于你要导出的数据类型和记录数(数据大小):

  • 如果你有很多行,比如成千上万行,txt 是最好的选择,如果你知道数据中没有前导或尾随零,则可以导出到 csv,否则使用 txtxlsx 格式。导出到 csv 可能会删除零。

  • 如果你不处理很多行,那么 xlsx 库更好

  • xlsx 库可能依赖于 java,所以确保你使用的库不需要它

  • 当处理许多行时,xlsx 库可能存在问题或速度较慢,因此仍然可以使用 txtcsv 更好

对于你的具体问题,似乎你不需要处理大量行,所以你可以使用:

library(openxlsx)

# read data from an Excel file or Workbook object into a data.frame
df <- read.xlsx('name-of-your-excel-file.xlsx')

# for writing a data.frame or list of data.frames to an xlsx file
write.xlsx(df, 'name-of-your-excel-file.xlsx')

-1

您需要使用format修改您的列:

format(your_data$your_column, trim = F)

因此,当您导出为 .csv 文件时,前导零将会保留。


-2

处理前导零时,如果要导出到Excel中,需要小心。Excel有一种自作聪明的倾向,会自动修剪前导零。否则你的代码是没问题的,在任何其他文本编辑器中打开文件都应该显示零。


1
这不是答案,不应标记为回答。JeffR的答案已经妥善回答了这个问题,而不是这个。 - Neal Barsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接