在R中将指数值导入为数字

use*_*032 4 import r

我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我在read.table中使用这些规范:colClasses = c("character","numeric" ").

如果我在df_file中保存了一个数据帧,这样做很有用:

df<- data.frame(V1=c("s1","s2","s3","s4"), V2=c("1e-04","1e-04","1e-04","1e-04")

read.table(df_file, header = FALSE,  comment.char="", colClasses = c("character", "numeric"), stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

问题是在某些情况下,我在第二列中使用指数形式的数值框架,并且在这些情况下导入不起作用,因为它不会将列识别为数字(或者如果我将其导入为"字符"不要指定colClasses),所以我的问题是:即使值是指数的,我如何指定要导入为数字的列?

例如:

df<- data.frame(V1=c("s1","s2","s3","s4"), V2=c("10^(-4)","10^(-4)","10^(-4)","10^(-4)"))
Run Code Online (Sandbox Code Playgroud)

我希望将所有指数值导入为数字,但即使我在导入后尝试从字符更改为数字,我也会获得所有"NA"(as.numeric(as.character(df $ V2))"警告消息:通过胁迫引入的NAs")

我曾试图将"真实"或"复杂"用于colClasses,但它仍然将指数作为字符导入.

请帮帮忙,谢谢!

小智 6

我认为问题在于你的指数形式与R风格不匹配.如果你以字符向量的形式阅读它们,你可以将它们转换为指数,如果你知道它们都是指数.使用gsub去除"10 ^("和")",留下"-4",转换为数字,然后转换回指数.可能不是最快的方式,但它的工作原理.

从你的例子:

df < - data.frame(V1 = c("s1","s2","s3","s4"),V2 = c("10 ^( - 4)","10 ^( - 4)", "10 ^( - 4)", "10 ^( - 4)"))

 df<- data.frame(V1=c("s1","s2","s3","s4"), V2=c("10^(-4)","10^(-4)","10^(-4)","10^(-4)"))
 df$V2 <- 10^(as.numeric(gsub("10\\^\\(|\\)", "", df$V2)))
 df
#  V1    V2
#1 s1 1e-04
#2 s2 1e-04
#3 s3 1e-04
#4 s4 1e-04
Run Code Online (Sandbox Code Playgroud)

详细发生的事情是:gsub("10\\^\\(|\\)", "", df$V2)用空字符串替换10 ^(和)(你需要转义克拉和圆括号),as.numeric()将你的-4字符串转换成数字-4,然后你只需要运行10 ^你刚才制作的数字向量的元素.


Mat*_*rde 6

如果您在阅读data.framestringsAsFactors=FALSE,相关列应作为字符向量输入,在这种情况下,您可以简单地执行:

transform(df, V2=eval(parse(text=V2)))
Run Code Online (Sandbox Code Playgroud)