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

R write dataframe column to csv having leading zeroes

提问人:karx 提问时间:2/23/2015 更新时间:5/7/2023 访问量:19479

问:

我有一个表,用于存储不同长度的前缀。 表(ClusterTable)的片段

ClusterTable[ClusterTable$FeatureIndex == “前缀2”,'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)

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

R 导出为 CSV

评论

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

答:

-2赞 cdeterman 2/23/2015 #1

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

评论

1赞 Neal Barsch 4/6/2021
这不是答案,不应标记为回答问题。JeffR 的回答正确地回答了这个问题,而不是这个问题
6赞 giraffehere 11/11/2015 #2

编辑:截至 2021 年 8 月 5 日再次测试,查找和替换方法不再有效。:(“快速填充”的解决方法

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

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

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

较新的 Excel 版本:
由于查找和替换确实删除了撇号和 0(在较新的 Excel 版本中),另一种方法是使用“快速填充”添加一列并添加不带撇号的值。如果单元格中的值格式不同(例如,某些单元格中有多个数字),则应仔细检查“快速填充”的结果,并在需要时进行调整。然后可以删除前一列。

较旧的 Excel 版本:
此时您可以将列格式化为“文本”,然后进行查找和替换以删除撇号(也许为此制作一个宏)。

评论

0赞 user17144 8/3/2021
这对我不起作用。在用“”搜索替换撇号后,前导零消失了。
1赞 giraffehere 8/6/2021
刚刚再次尝试,它也不适用于我最新版本的 Excel。答案是 6 年前的,所以似乎 Excel 团队找到了一种更烦人的方法。我建议您不要在这里使用 Excel 来检查数据或保留撇号。
4赞 ddunn801 7/15/2016 #3

如果只是视觉对象需要它,只需在编写 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 中是隐藏的。

评论

0赞 Jorge Mendoza Ruiz 7/28/2022
我试图用 data.frame 解决这样的问题,paste0(variable, “\t”) 完美地解决了它。非常感谢。
3赞 JeffR 2/13/2017 #4

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

write.csv(ClusterTable,file="My_Clusters.txt")
read.table(file=My_Clusters.txt, sep=",")
0赞 Kcarros 10/18/2017 #5

如果您尝试使用 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赞 Ibo 9/21/2019 #6

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

  • 如果有许多行(例如数千行),则是最佳路由,如果您知道数据中没有前导零或尾随零,则可以导出到使用或格式。导出到很可能会删除零。txtcsvtxtxlsxcsv

  • 如果你不处理很多行,那么库会更好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赞 igorkf 4/17/2020 #7

您必须使用以下命令修改您的列:format

format(your_data$your_column, trim = F)

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