2015-05-07 236 views
2

我想找出有什麼區別的data.frame(cbind ...)與data.frame(...)中的R

data.frame(a,b,c,y) 

data.frame(cbind(a,b,c,y)) 
使用之間

我有三個向量a,b,c包含因子(文本)和一個(y)存儲計數(數字)。

根據不同的符號,我得到不同的答案,當我運行這個模型

model.glm <- glm(y ~ a * b * c, data=blabla, family=poisson) 

我想這是因爲正在因素「無因素」,但我不知道的一個。 哪種方法是正確的?

回答

8

默認情況下,cbind返回一個matrix,它只能有一種數據類型。混合數據類型(例如數字和字符)通常被強制轉換爲字符。例如:

a <- 1:3 
b <- c("a", "b", "c") 
cb <- cbind(a,b) 
cb 
    a b 
[1,] "1" "a" 
[2,] "2" "b" 
[3,] "3" "c" 
class(cb) 
[1] "matrix" 
typeof(cb) 
[1] "character" 

當你進入一個data.frame,則默認情況,字符被轉換成因子(StringsAsFactors = TRUE;設置爲FALSE來抑制這種行爲),這是基本的字符串整數表示。

df <- data.frame(cb) 
typeof(df$a) 
[1] "integer" 
typeof(df$b) 
[1] "integer" 
class(df$a) 
[1] "factor" 
class(df$b) 
[1] "factor" 

我假設這是你想要的行爲,並自data.frame將很好地cbind你的東西,同時保持其原有的類型(除了字符串轉換爲因素,其中,正如我所說,可以被壓制),我會堅持更簡單的data.frame(a,b)構造。

1

cbind(a,b,c,y)返回一個不允許多種類型數據的矩陣。所以,如果說a,b和c是數字,y是一個因子,那麼data.frame(cbind(a,b,c,y))只包含因子。

沒有cbind(),a,b和c未被轉換爲因子。

+0

我在閱讀這篇文章時感到無聊,而一些代碼正在執行,並且你的答案在這裏解決了一些真正令我不快的事情。先生,好! –

+0

因素是一個不好的例子,因爲矩陣(據我所知)不能是課堂因素。試試'str(data.frame(cbind(3:4,factor(letters [1:2]))))'或'str(matrix(factor(1:4),ncol = 2))' – Frank

+0

yes but factor被強制爲矩陣中的字符。所以如果'a = 1:4'和'b = rep(「a」,4)''那麼'cbind(a,b)'只包含字符,'data.frame(a,b)'不包含相同data.frame(cbind(a,b,c,y))'只包含因素「data.frame(cbind(a,b))' – xraynaud