[英]Importing xlsx data to R when numbers have a comma as decimal separator
.xlsx
文件中的数据导入 R 以便数字表示为数字,而它们的原始小数分隔符是逗号而不是点? 我知道的唯一 package 在处理 excel 时是来自readxl
的tidyverse
。
我正在寻找一种不需要在任何其他软件中打开和编辑 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 中勾选“匹配整个单元格内容”框.
使用readxl
package 您可以使用locale
指定decimal_mark
:
library(readxl)
read_excel("excel_file.xlsx", locale=locale(decimal_mark = ","))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.