4

我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我将这些规范与 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)

问题是在某些情况下,我在第二列中有具有指数形式的数值的数据框,在这些情况下,导入不起作用,因为它不能将该列识别为数字(或者如果我将其作为“字符”导入不要指定 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))“警告消息: 强制引入的 NA")

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

请帮忙,谢谢!

4

3 回答 3

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$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^您刚刚制作的数值向量的元素。

于 2013-06-24T11:42:27.397 回答
6

如果您在data.framewithstringsAsFactors=FALSE中阅读,有问题的列应该作为字符向量出现,在这种情况下,您可以简单地执行以下操作:

transform(df, V2=eval(parse(text=V2)))
于 2013-06-24T12:27:44.340 回答
3

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

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
于 2013-06-24T11:58:58.950 回答