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

时间:2013-06-24 11:20:37

标签: r import

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

如果我在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)

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

例如:

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

我想将所有指数值导入为数字,但即使我在导入后尝试从字符更改为数字,我也会得到所有“NA”(as.numeric(as.character(df $ V2)) “警告信息:强制引入的NAs”)

我曾尝试将“真实”或“复杂”与colClasses一起使用,但它仍然会将指数作为字符导入。

请帮忙, 谢谢!

3 个答案:

答案 0 :(得分:6)

如果您使用data.frame宣读stringsAsFactors=FALSE,则相关列应作为字符向量输入,在这种情况下,您只需执行以下操作:

transform(df, V2=eval(parse(text=V2)))

答案 1 :(得分:5)

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

从你的例子:

  

df&lt; - 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

详细情况发生了什么:gsub("10\\^\\(|\\)", "", df$V2)用空字符串替换10 ^(和)(你需要转义克拉和圆括号),as.numeric()正在将你的-4字符串转换为数字-4,那么你只是在你刚刚创建的数字向量的每个元素上运行10 ^。

答案 2 :(得分:3)

您可以使用readLines首先加载数据并执行所需的所有操作,然后将read.tabletextConnection一起使用,如下所示:

tt <- readLines("~/tmp.txt")
tt <- gsub("10\\^\\((.*)\\)$", "1e\\1", tt)
read.table(textConnection(tt), sep="\t", header=TRUE, stringsAsFactors=FALSE)
  V1    V2
1 s1 1e-04
2 s2 1e-04
3 s3 1e-04
4 s4 1e-04