使用R转换在Excel文件中存储为文本的数字

时间:2019-08-29 17:44:45

标签: r excel openxlsx

我想将R中的数据输出到excel文件,并且一直在使用openxlsx软件包。

writeDataTable是我一直在使用的功能。问题是我希望其中一列的条目是数字和文本的混合。由于R中数据框的列必须具有所有相同类型的条目,因此所有内容都会转换为字符条目。

当我打开输出的excel文件时,我在数字单元格的角落看到一个绿色的小三角形,告诉我它们是作为文本存储的数字,并提供了转换为数字的选项。

我想知道是否可以让R在保存文件之前在创建的工作簿对象中为我进行转换。

我花了很多时间来研究这个问题,寻找可能有帮助的不同库,但到目前为止还找不到任何东西。我下面有一个例子。请注意,这不是我正在使用的确切数据框,而是出于说明目的。

df = data.frame(A = c('Dog', '5', '7.04'), B = c('Cat', '12', '1.23'))
wb = createWorkbook()
addWorksheet(wb, "Sheet2")
writeDataTable(wb, "Sheet2", df)
output_file = "C:\\Users\\johndoe\\documents\\excel_file.xlsx"
saveWorkbook(wb, output_file)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是一种方法,但是会很慢。

### unchanged
library(openxlsx)
df = data.frame(A = c('Dog', '5', '7.04'), B = c('Cat', '12', '1.23'))
wb = createWorkbook()
addWorksheet(wb, "Sheet2")
writeDataTable(wb, "Sheet2", df)

### this is the new part
for (cn in seq_len(ncol(df))) {
  for (rn in seq_len(nrow(df))) {
    if (!is.numeric(df[rn,cn]) && !is.na(val <- as.numeric(as.character(df[rn,cn])))) {
      writeData(wb, "Sheet2", val, startCol = cn, startRow = 1L + rn)
    }
  }
}

### unchanged
saveWorkbook(wb, output_file)

问题在于这一次要写入一个单元格。

要改善这一点的方法:

  • 如果数字多于字符串,那么您可能希望通过用as.numeric转换相关列(产生大量NA)然后再将其转换为一点来扭转这种情况:一个人用前一个字符串覆盖单元格的NA值。

  • 您可以查找要替换的单元格运行(也许在列中使用rle),这将逐簇而不是逐个单元地写。