将指数值作为R中的数字导入
我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我将这些规范用于read.table:colClasses=c(“字符”、“数字”) 如果我在df_文件中保存了一个数据帧,这将非常有用,如下所示:将指数值作为R中的数字导入,r,import,R,Import,我必须自动导入许多数据集,第一列是名称,所以是字符向量,第二列是数字向量,所以我将这些规范用于read.table:colClasses=c(“字符”、“数字”) 如果我在df_文件中保存了一个数据帧,这将非常有用,如下所示: 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="
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)
df我认为问题在于你写的指数的形式与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
df您可以使用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
tt如果使用stringsAsFactors=FALSE
读入data.frame
,则相关列应作为字符向量输入,在这种情况下,您只需执行以下操作:
transform(df, V2=eval(parse(text=V2)))
尝试类似的方法:as.numeric(gsub(“0\\^”,“e”,gsub([()]”,“,”,df$V2))
可能与Hi-Arun重复,谢谢。所以我想没有“简单的出路”?也就是说,如果我想这样做,我必须首先导入第二列为“as.character”的所有数据集,然后仅当这些列具有指数项时才这样做?@user2337032,您可以使用readLines
。我已经发布了一个答案。谢谢你,阿伦,你的功能也可以!谢谢,这很有效。我只是首先作为字符导入,并用grep检查是否有“^”,然后使用您的代码。非常感谢。这可能会比首先读取所有文件更快,而且对我来说更好,因为我的文件很大!非常感谢。尽管如此,我认为作为一个带有单独列的数据框重新导入还是有问题的:tt这是因为您使用的是\(
而不是\(
和\)
而不是\)
。你应该逃两次。这要简单得多!只有一个问题,如果我有colnames(所以header=TRUE)并想替换第二列,我将如何使用它?这给了我一个错误:df[,2]警告消息:在[你能发布dput(head(df,5))
的输出吗?是的,当然,>dput(head(df,5))结构(list(V1=结构(1:4,.Label=c(“s1”,“s2”,“s3”,“s4”),class=”factor”),V2=结构(c(1L,1L,1L,1L),.Label=“10^(-4)”,class=”factor”),.Names=c(“V1”,“V2”,“V2”),row.Names=c(NA,4L),class=“data.frame”)将V2列作为一个因子。您必须将其转换为字符,或者使用as.is=TRUE
重新读取它。出现错误的原因是您需要df
transform(df, V2=eval(parse(text=V2)))