2011-02-08 52 views
76

我已經導入測試文件,並試圖使直方圖轉換串數字

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") 
hist <- as.numeric(pichman$WS)  

然而,我在數據集中的值獲得不同的號碼。原本我以爲,這是因爲我有文字,所以我刪除的文本:

table(pichman$WS)  
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]  

不過,我仍然得到非常高的數字沒有任何人有一個想法?

+0

另請參見http://stackoverflow.com/questions/4798343/和http://stackoverflow.com/questions/3418128 – Aaron 2011-02-08 15:15:39

回答

97

我懷疑你有問題的因素。例如,

> x = factor(4:8) 
> x 
[1] 4 5 6 7 8 
Levels: 4 5 6 7 8 
> as.numeric(x) 
[1] 1 2 3 4 5 
> as.numeric(as.character(x)) 
[1] 4 5 6 7 8 

一些評論:

  • 你提到你的載體包含字符 「向下」 和 「無數據」。期望/希望as.numeric如何處理這些值?
  • read.csv,請嘗試使用參數stringsAsFactors=FALSE
  • 你確定這是sep="/t,而不是sep="\t"
  • 使用命令head(pitchman)檢查數據
  • 另外的第一FEWS行,這是非常棘手的猜測你的問題在於何時不提供數據。一個最小的工作例子總是最好的。例如,我無法運行命令pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t"),因爲我無權訪問數據集。
+1

我在新的答案中添加了時間。爲你+1,因爲你有正確的選擇。 – 2011-02-08 10:23:57

10

正如csgillespie所說。 stringsAsFactors默認爲TRUE,它將任何文本轉換爲一個因子。所以即使在刪除文本之後,您的數據框中仍有一個因素。

現在關於轉換,有一個更優化的方式來做到這一點。所以我把它作爲參考:

> x <- factor(sample(4:8,10,replace=T)) 
> x 
[1] 6 4 8 6 7 6 8 5 8 4 
Levels: 4 5 6 7 8 
> as.numeric(levels(x))[x] 
[1] 6 4 8 6 7 6 8 5 8 4 

要顯示它的工作。

時序:

> x <- factor(sample(4:8,500000,replace=T)) 
> system.time(as.numeric(as.character(x))) 
    user system elapsed 
    0.11 0.00 0.11 
> system.time(as.numeric(levels(x))[x]) 
    user system elapsed 
     0  0  0 

這是一個很大的進步,但並不總是一個瓶頸。但是,如果你有一個大的數據框和許多要轉換的列,它就變得很重要。