簡體   English   中英

在R中將指數值導入為數字

[英]Import exponential values as numeric in R

我必須自動導入許多數據集,第一列是名稱,所以是字符向量,第二列是數字向量,所以我在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))“警告消息:通過脅迫引入的NAs“)

我曾試圖將“真實”或“復雜”用於colClasses,但它仍然將指數作為字符導入。

請幫幫忙,謝謝!

我認為問題在於你的指數形式與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 ^。

如果您使用stringsAsFactors=FALSE讀入data.frame ,則相關列應作為字符向量輸入,在這種情況下,您只需執行以下操作:

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

您可以使用readLines首先加載數據並執行所需的所有操作,然后將read.tabletextConnection一起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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM