【问题标题】:R write dataframe column to csv having leading zeroesR将数据框列写入具有前导零的csv
【发布时间】:2015-04-24 20:45:31
【问题描述】:

我有一个存储不同长度前缀的表.. 表的sn-p(ClusterTable)

ClusterTable[ClusterTable$FeatureIndex == "Prefix2",'FeatureIndex', '特征值')]

   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)等。 谢谢

【问题讨论】:

  • 我找到了stackoverflow.com/questions/24043162/r-excel-leading-zeroes的相关问题,但这是为了阅读,并且有固定长度
  • 究竟什么时候丢失了“0”?我尝试用 R 编写并打开“01”(作为字符)并且效果很好。使用任何文本编辑器打开它也应该可以正常工作。
  • 在我的 csv 文件中。我将此 csv 文件用作另一个程序的源。如果我打开并签入 csv,则没有前导零
  • @karx,你是在 excel 中打开 csv 吗?我认为excel可能会尝试变得聪明并自动删除前导零。
  • @cdeterman 你不知道我有多愚蠢。万分感谢。在我的文本编辑器中查看它,哇!在将其提供给下一个 preogram 之前,我每次都手动检查 csv。只是要确定。谁知道格外小心可能会在背后咬你

标签: r csv export-to-csv


【解决方案1】:

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

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

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

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

【讨论】:

  • 这对我不起作用。在用“”搜索替换撇号后,前导零消失了。
  • 刚刚再试一次,它也对我最新版本的 Excel 不起作用。答案是 6 年前的,所以 Excel 团队似乎找到了一种更烦人的方法。我建议您只是不要在这里使用 Excel 来检查数据或保留撇号。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这几乎是您从 R 导出时可以采用的路线。这取决于您要导出的数据类型和记录数(数据大小):

        • 如果您有很多行(例如数千行),txt 是最佳路径,如果您知道数据中没有前导零或尾随零,则可以导出到csv,或者使用@987654323 @ 或 xlsx 格式。导出到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')
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 这不是答案,不应标记为回答问题。 JeffR 的回答正确回答了这个问题,而不是这个
          【解决方案7】:

          您必须使用format 修改您的列:

          format(your_data$your_column, trim = F)
          

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

          【讨论】:

            猜你喜欢
            • 2012-03-19
            • 1970-01-01
            • 2023-01-15
            • 2019-10-25
            • 2021-01-22
            • 2014-03-28
            • 2010-12-24
            • 2020-08-25
            • 2013-10-14
            相关资源
            最近更新 更多