R将数据帧列写入具有前导零的csv

R write dataframe column to csv having leading zeroes

我有一个 table 存储不同长度的前缀.. table(ClusterTable)

的片段

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

   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)

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

在处理前导零时,如果导出到 excel,则需要谨慎。 Excel 倾向于超越自己并自动 trim 前导零。否则你的代码很好,在任何其他文本编辑器中打开文件应该显示零。

编辑:截至 2021 年 8 月 5 日再次测试,这不再有效。 :(

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

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

当您在 excel 中打开输出时,撇号会告诉 excel 保留所有字符而不是删除前导零。此时您可以将该列格式化为“文本”,然后进行查找和替换以删除撇号(也许为此制作一个宏)。

如果只是为了视觉需要,只需要在写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 中。

将文件另存为 csv 文件,但扩展名为 txt。然后使用 read.tablesep=",":

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

如果您尝试使用 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")

这几乎是您从 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')

您必须使用 format:

修改您的列
format(your_data$your_column, trim = F)

因此,当您导出为 .csv 时,前导零将继续存在。