提问人:karx 提问时间:2/23/2015 更新时间:5/7/2023 访问量:19479
R 将数据帧列写入具有前导零的 csv
R write dataframe column to csv having leading zeroes
问:
我有一个表,用于存储不同长度的前缀。 表(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) 等。 谢谢
答:
在处理前导零时,如果导出到 excel,则需要谨慎。Excel 倾向于超越自己并自动修剪前导零。否则,您的代码很好,在任何其他文本编辑器中打开文件应该显示零。
评论
编辑:截至 2021 年 8 月 5 日再次测试,查找和替换方法不再有效。:(“快速填充”的解决方法
我知道这是一个老问题,但我碰巧发现了一种解决方案,可以在 excel 中打开 .csv 输出时保持铅零。在 R 中编写.csv之前,请在每个值的前面添加一个撇号,如下所示:
vector <- sapply(vector, function(x) paste0("'", x))
当您在 excel 中打开输出时,撇号将告诉 excel 保留所有字符并且不要删除前导零。
较新的 Excel 版本:
由于查找和替换确实删除了撇号和 0(在较新的 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.table
sep=","
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
txt
xlsx
csv
如果你不处理很多行,那么库会更好
xlsx
xlsx
库可能依赖于此库,因此请确保使用不需要它的库java
xlsx
在处理许多行时,库要么有问题,要么速度很慢,所以仍然是更好的方法txt
csv
对于您的特定问题,您似乎没有处理大量行,因此您可以使用:
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 时,前导零将继续存在。
评论