将列中的对数表达式从字符转换为数字类

时间:2016-01-15 14:16:18

标签: r excel

我使用XLConnect包导入了一个excel文件:

 data <- loadWorkbook("C:/Users...")
 data <- readWorksheet(data, sheet = "Blad1")

数据由包含字符串和数字的列组成。有些列包含指数数字,例如:“8.55×10-23”(应为10 ^ -23)。所有这些列都被导入为字符向量而不是数字向量,我可以理解。 但是我尝试了一些不同的方法将这些列转换为数字向量而没有成功:

  1. 试图(在这种情况下为第9列):

    data[, 9] <- gsub(" × 10", "*10^(", data[, 9])
    data[, 9] <- paste(data[, 9], ")", sep = "")
    
  2. 实际上成功地使指数数字看起来像:8.94 * 10 ^( - 11)。然后我尝试了:

    data[, 9] <- lapply(data[, 9], as.numeric)
    print(data)
    

    但是我在那一栏中得到了NA。

    我也尝试将NA的数字改为8.94x10 ^( - 11),8.94 * 10 ^ -11,8.94 * 10E-11,8.94 * e(-11)(以及其他组合),在*和x和^之前添加/和//(以便将符号读作算术运算符而不是字符),但它没有帮助。如果我直接在控制台中键入表达式8.94 * 10 ^( - 11),它可以正确评估它并成为数字。我也尝试在readWorksheet中创建参数colTypes,但是我还没能得到正确的语法(我认为),而且我没有在互联网上找到有效的例子(我真的不明白帮助文件那个论点)。

    如果有人有解决方案,那真的很有帮助,因为我觉得我真的错过了一些明显的东西。我事先为这个问题的愚蠢问题/坏解释道歉,我对R来说很新... =)

    非常感谢你的帮助!

    此致,

    Sinael

    编辑:

    到目前为止,我的代码看起来像这样:

     GWAS_data <- function () {
        library(XLConnect)
        GWAS_data <- loadWorkbook("C:/Users...") #where the data is located on my computer
    
        GWAS_data2 <- readWorksheet(GWAS_data, sheet = "Blad1")
    
        GWAS_data2[, 9] <- gsub(" × 10", "\\*10\\^\\(", GWAS_data2[, 9])
    
     # Starting with just trying to transform column 9:
    
        GWAS_data2[, 9] <- paste(GWAS_data2[, 9], ")", sep = "")
    
        GWAS_data2[, 9] <- lapply(GWAS_data2[, 9], as.numeric)
                print(GWAS_data2)
                print(lapply(GWAS_data2, class))
    

    然后我最终将第9列作为NA值...... 并且数据是一个.xls文件,第一行数据看起来像这样,在libre office文档中我无法找到如何在这里上传=):

    rs131 4 44870448 GNPDA2 T / C 0.44 0.067 0.007 8.94×10-11 4.29×10-18 1.58×10-23

    或者如果您喜欢用逗号分隔:

    rs131,4,44870448,GNPDA2,T / C,0.44,0.067,0.007,8.94×10-11,4.29×10-18,1.58×10-23

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

尝试使用科学记谱法的格式,如下所示:

s <- '8.94*10^(-11)'
s <- gsub("\\*10\\^", "e", s)
s <- gsub('\\(|\\)', '', s)
as.numeric(s)
[1] 8.94e-11

答案 1 :(得分:0)

不知怎的,我解决了它。首先我更改了函数的第一部分,我使用read.csv而不是使用XLConnect包。 read.csv自动转换所有&#34; ^&#34; to&#34;?&#34;,但是我用gsub将它们改成标准格式,即&#34; 8.94e-11&#34;。

但是,我认为主要问题出在功能的第二部分:

  GWAS_data2[, 9] <- lapply(GWAS_data2[, 9], as.numeric)

我在某处读到,如果它的单个列,该函数将其视为一个向量,并且当我这样编写时,问题就解决了,并且将第9列转换为第11列而不仅仅是第9列:

 GWAS_data2[, 9:11] <- lapply(GWAS_data2[, 9:11], as.numeric)

不太明白为什么它有效,但我到了那里。谢谢你的帮助!