我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我在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 ^你刚才制作的数字向量的元素.
如果您在阅读data.frame
时stringsAsFactors=FALSE
,相关列应作为字符向量输入,在这种情况下,您可以简单地执行:
transform(df, V2=eval(parse(text=V2)))
Run Code Online (Sandbox Code Playgroud)