2012-02-26 36 views
2

我不明白我的數據框上data.matrix的結果。目標是遏制結果。數據:使用data.matrix轉換數據幀(因子),奇怪的結果

> tab.c.graph 
    BacD BacE BacF 
J01 2 6 10 
J02 2 2 0 
J03 9 4 6 
J04 1 7 3 
J05 11 10 2 
J06 9 7 7 
J07 8 3 0 
J08 6 2 1 
J09 4 3 2 
J10 4 4 1 
> str(tab.c.graph) 
'data.frame': 10 obs. of 3 variables: 
$ BacD: Factor w/ 8 levels "1","11","2"," 2",..: 4 3 8 1 2 8 7 6 5 5 
    ..- attr(*, "names")= chr "J01" "J02" "J03" "J04" ... 
$ BacE: Factor w/ 6 levels "10","2","3","4",..: 5 2 4 6 1 6 3 2 3 4 
    ..- attr(*, "names")= chr "J01" "J02" "J03" "J04" ... 
$ BacF: Factor w/ 8 levels "0","1","10","2",..: 3 1 7 6 5 8 1 2 4 2 
    ..- attr(*, "names")= chr "J01" "J02" "J03" "J04" ... 

> data.matrix(tab.c.graph) 
    BacD BacE BacF 
J01 4 5 3 
J02 3 2 1 
J03 8 4 7 
J04 1 6 6 
J05 2 1 5 
J06 8 6 8 
J07 7 3 1 
J08 6 2 2 
J09 5 3 4 
J10 5 4 2 

> str(data.matrix(tab.c.graph)) 
int [1:10, 1:3] 4 3 8 1 2 8 7 6 5 5 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:10] "J01" "J02" "J03" "J04" ... 
    ..$ : chr [1:3] "BacD" "BacE" "BacF" 

爲什麼data.matrix與我的data.frame有如此不同?如上所述,我只需要繪製這些數據。

Thanx幫忙!

回答

4

看看發生了什麼,看看下面的例子:

> (f <- gl(2, 1, 10, labels=3:4)) 
[1] 3 4 3 4 3 4 3 4 3 4 
Levels: 3 4 
> as.numeric(f) 
[1] 1 2 1 2 1 2 1 2 1 2 
> as.numeric(as.character(f)) 
[1] 3 4 3 4 3 4 3 4 3 4 

要轉換因素(這是你在你的data.frame)爲numeric載體,同時保留其標籤(否則你只會得到它的水平),你需要像as.numeric(as.character())

因此,要麼確保您正確地讀取輸入數據(如果數字被引用,並且options("stringsAsFactors")設置爲TRUE,那麼很可能它們將被轉換爲因子),或者之後轉換您的data.frame。這可以按照列方式進行,例如,

dfrm <- data.frame(x=factor(c(3,2,1,8,4)), y=factor(c(5,6,1,2,3))) 
m <- sapply(dfrm, function(x) as.numeric(as.character(x))) 
plot(m) 

我誤解你的問題,我還以爲你使用as.matrix,不data.matrix。這不會改變任何事情,因爲這兩種功能都會將因素轉換爲其內部表示形式,如聯機幫助中所述:

因子和有序因子被其內部代碼替換。

+0

謝謝你的解釋。我已經嘗試過用as.numeric(as.character(tab.c.graph))來轉換我的因素,但是我通過強制錯誤引入了NAs並且> levels(tab.c.graph)給了我NULL,所以所有因素在我的表中是數字... – Chargaff 2012-02-26 17:55:50

+0

你不能在整個data.frame上獲得關卡。你需要使用關卡(tab.c.graph $ BacD),如果你想在轉換之前查看特定因素的等級。 – 2012-02-26 18:03:51

+0

是的,得到了​​轉換工作。你的解釋幫助了我很多。謝謝! – Chargaff 2012-02-26 18:09:54