我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我在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一起使用,但它仍然会将指数作为字符导入。
请帮忙, 谢谢!
答案 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.table
与textConnection
一起使用,如下所示:
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