代码之家  ›  专栏  ›  技术社区  ›  blazej

当数字以逗号作为十进制分隔符时,将xlsx数据导入R

  •  8
  • blazej  · 技术社区  · 7 年前

    如何从导入数据 .xlsx 文件输入到R中,以便数字表示为数字,而其原始十进制分隔符是逗号而不是点?

    我所知道的处理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))
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Aaron - mostly inactive    7 年前

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

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

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

        2
  •  1
  •   Martin Boros    7 年前

    用“.”替换“.”很容易并将列重铸为数字。例子:

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

    只需使用base R和gsub。

        3
  •  1
  •   Trenton McKinney ivirshup    5 年前

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

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

    如果您将小数设置为 . 在替换缺失值的所有实例之前,请确保在Excel中勾选“匹配整个单元格内容”的框 .