2012-03-16 54 views
2

我今天發現了一些奇怪的東西,我想問你是否存在我所看到的邏輯原因,或者如果你認爲這是一個錯誤應報告給R-devel的團隊:as.matrix不保留空數據的數據模式。框架

df <- data.frame(a = 1L:10L) 
class(df$a) 
# [1] "integer" 
m <- as.matrix(df) 
class(m[, "a"]) 
# [1] "integer" 

沒有驚喜至今:as.matrix保留數據模式,這裏的「整數」。然而,空(沒有行)data.frame:

df <- data.frame(a = integer(0)) 
class(df$a) 
# [1] "integer" 
m <- as.matrix(df) 
class(m[, "a"]) 
# [1] "logical" 

任何想法,爲什麼從「整數」模式改變爲「邏輯」在這裏?我正在使用版本2.13.1

謝謝。

+0

不知道爲什麼會發生這種情況,但是您最好在發佈到R-devel之前在最新快照上測試它。他們不喜歡6個月大的R版本的「bug報告」。 – 2012-03-16 23:57:34

+0

我在這裏得到了相同的行爲,R版本2.14.1(2011-12-22)。 – 2012-03-16 23:58:35

+0

而我在2.14.2中看到同樣的東西 – joran 2012-03-17 00:04:05

回答

4

這是因爲在as.matrix.data.frame這一行:

if (any(dm == 0L)) return(array(NA, dim = dm, dimnames = dn)) 

基本上,如果任何尺寸是零,你會得到一個數組的NA「全」。我說「全部」,因爲沒有真正的觀察,因爲其中一個維度爲零。

該類爲logical的原因是因爲這是NA的類。其他課程有專門的NA,但在這裏並不是必須的。例如:

> class(NA) 
[1] "logical" 
> class(NA_integer_) 
[1] "integer" 
> class(NA_real_) 
[1] "numeric" 
> class(NA_complex_) 
[1] "complex" 
> class(NA_character_) 
[1] "character" 
+0

謝謝Joshua,我希望我知道如何像你一樣尋找到R的基本代碼。我停在'print(as.matrix)'...... – flodel 2012-03-18 00:39:15

+2

@ flodel:'print(as.matrix)'顯示'UseMethod(「as.matrix」)',然後我看'methods(as.matrix) '。然後你可以使用print(as.matrix.data.frame)來查看data.frame方法。如果方法碰巧是「不可見的」,那麼可以使用'getAnywhere'(例如'getAnywhere(「as.matrix.dist」)')。 – 2012-03-18 13:20:05

+0

這些對我將來會非常有幫助,感謝你跟進Joshua。 – flodel 2012-03-18 13:36:52