当数字具有逗号作为小数分隔符时,将 xlsx 数据导入 R



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

在处理 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))

我强烈怀疑这些列被解读为字符还有其他原因,很可能它们是可怕的"存储为文本的数字"。

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

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

将","替换为"."并将列重新转换为数字非常容易。例:

> 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。

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

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

如果您在将小数设置为.的情况下遇到此问题,请确保在替换缺失值的所有实例之前在Excel中勾选"匹配整个单元格内容"框.

最新更新