当数字以逗号作为小数点分隔符时将 xlsx 数据导入 R

Importing xlsx data to R when numbers have a comma as decimal separator

如何将数据从 .xlsx 文件导入到 R 中,以便当数字的原始小数点分隔符是逗号而不是点时,将其表示为数字?

在处理 excel 时,我所知道的唯一包是来自 tidyversereadxl

我正在寻找一种不需要在任何其他软件中打开和编辑 excel 文件(并且可以处理数百个要导入的列)的解决方案 - 如果可能的话,我会将所有 excel 导出到 .csv 并使用我知道的可以采用 dec= 参数的工具导入它们。

到目前为止,我最好的解决方案是将数字导入为字符,然后对其进行转换:

library(dplyr)
library(stringr)

var1<- c("2,1", "3,2", "4,5")
var2<- c("1,2", "3,33", "5,55")
var3<- c("3,44", "2,2", "8,88")
df<- data.frame(cbind(var1, var2, var3))

df %>%
      mutate_at(vars(contains("var")),
                str_replace,
                pattern = ",",
                replacement = "\.") %>%
      mutate_at(vars(contains("var")), funs(as.numeric))

将“,”替换为“.”非常简单。并将列重铸为数字。示例:

> x <- c('1,00','2,00','3,00')
> df <- data.frame(x)
> df
     x
1 1,00
2 2,00
3 3,00
> df$x <- gsub(',','.',df$x)
> df$x <- as.numeric(df$x)
> df
  x
1 1
2 2
3 3
> class(df$x)
[1] "numeric"
> 

只使用基础 R 和 gsub。

我强烈怀疑这些列被解读为字符还有其他一些原因,很可能它们是可怕的 "Number Stored as Text"。

对于普通数字(存储为数字),在为单个文件或整个系统设置切换为逗号作为小数点分隔符后,readxl::read_excel 正确读取数字。 (这是在我的 Windows 系统上。)即使在该列中的一个单元格中添加一个字符或设置 col_types="text",我也会使用小数点而不是逗号读取数字,提供更多证据表明 readxl 正在使用内部存储的数据类型。

我让 R 以逗号读取小数的唯一方法是将数据存储在 Excel 中作为文本而不是数字。 (您可以通过在数字前面加上单引号来输入它,例如 '1,7。)然后我在单元格的一角看到一个绿色的小三角形,它会弹出警告 "Number Stored as Text"。在我的探索中,我惊讶地发现 Excel 将对存储为文本的数字进行计算,因此这不是检查这一点的有效方法。

我在处理从同事那里收到的 Excel 电子表格时遇到了同样的问题。在我尝试使用 readxl 导入文件(失败)后,我将文件转换为 csv 文件,希望使用 read_delim 并摆弄语言环境和小数点符号来解决问题选项。但是无论我使用了哪个选项,问题仍然存在。

这是对我有用的解决方案:我发现在包含缺失值的单元格中使用的字符(. 在我的例子中)造成了麻烦。我回到 Excel 文件,将所有缺失值的单元格中的 . 替换为空白,同时只保留小数点的默认选项 (,)。之后,所有列都使用 readxl 正确导入为数字。

如果您将小数设置为 . 时遇到此问题,请确保在替换所有缺失值 [=13] 之前勾选 Excel 中的 "Match entire cell contents" 方框=]