将一个列中的对数expression式从字符转换为数字类

我已经通过使用XLConnect包导入了一个Excel文件:

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

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

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

     data[, 9] <- gsub(" × 10", "*10^(", data[, 9]) data[, 9] <- paste(data[, 9], ")", sep = "") 

这实际上成功地使指数数字看起来像:8.94 * 10 ^( – 11)。 然后我试着:

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

但是我拿到了那个专栏里的NA。

我也试过将NA变成8.94×10 ^( – 11),8.94 * 10 ^ -11,8.94 * 10E-11,8.94 * e(-11)(以及其他组合) //在*和x和^之前(以读取符号作为算术运算符而不是字符),但是它没有帮助。 如果我直接在控制台中inputexpression式8.94 * 10 ^( – 11),它可以正确评估它,并成为一个数字。 我也尝试在readWorksheet中使用参数colTypes,但是我还没有能够得到正确的语法(我认为),我还没有find在互联网上的例子(我真的不明白的帮助文件那个论点)。

如果有人有一个解决scheme,这将是非常有益的,因为它感觉我真的错过了一些明显的东西。 我对这个问题的愚蠢的问题/不好的解释事先道歉,我对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文件与第一行的数据看起来像这样,在自由职业者的办公室文件,我无法find如何在这里上传= ):

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

谢谢你的帮助!

试试e格式的科学记数法如下:

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

不知何故,我解决了它。 首先我改变了函数的第一部分,我使用read.csv而不是使用XLConnect包。 read.csv自动将所有“^”转换为“?”,但是我使用gsub将它们转换为标准格式,即“8.94e-11”。

但是,我认为主要的问题在于function的第二部分:

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

我读了一个地方,如果它的一个单独的列函数认为它是一个向量,不知何故,当我这样写这个问题就解决了,并且改变了第9列到第11列而不是第9列:

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

不太明白为什么它的工作,但我到了那里。 谢谢您的帮助!