2015-08-08 64 views
5

如果我用矩陣索引所有整數的data.frame,我會得到預期的結果。爲什麼在用數字矩陣索引數據框時類會從整數更改爲字符?

df <- data.frame(c1=1:4, c2=5:8) 
df1 
# c1 c2 
#1 1 5 
#2 2 6 
#3 3 7 
#4 4 8 

df1[matrix(c(1:4,1,2,1,2), nrow=4)] 
# [1] 1 6 3 8 

如果data.frame有一列字符,結果是所有字符,即使我只是索引整數列。

df2 <- data.frame(c0=letters[1:4], c1=1:4, c2=5:8) 
df2 
# c0 c1 c2 
#1 a 1 5 
#2 b 2 6 
#3 c 3 7 
#4 d 4 8 

df2[matrix(c(1:4,2,3,2,3), nrow=4)] 
# [1] "1" "6" "3" "8" 

class(df[matrix(c(1:4,2,3,2,3), nrow=4)]) 
# [1] "character" 

df2[1,2] 
# [1] 1 

我最好的猜測是R太忙,無法通過答案來檢查它們是否都來自某個類。任何人都可以解釋爲什麼發生這種情況?

回答

4

?Extract中描述了經由數字矩陣的索引用於矩陣和陣列。所以,這樣的索引對於數據框架起作用可能是令人驚訝的。

但是,如果我們看一下爲[.data.frame代碼(getAnywhere(`[.data.frame`)),我們可以看到,使用i一個matrixdata.frame提取元素時,該data.frame首先強制轉換爲matrixas.matrix

function (x, i, j, drop = if (missing(i)) TRUE else length(cols) == 
      1) 
{ 
# snip 
    if (Narg < 3L) { 
# snip 
    if (is.matrix(i)) 
     return(as.matrix(x)[i]) 

然後看看?as.matrix

「數據框的方法將返回一個字符矩陣,如果只有原子列和任何非(數字/邏輯/複數)列「。因此,因爲「df2」中的第一列屬於類character,所以在提取發生之前,as.matrix將強制整個數據幀到character矩陣。

相關問題