2012-12-27 53 views
1

我在編寫代碼,它允許我在R中找到每列中每個因子的編號,並且限制了我希望每列中的因子級別相同。我認爲這應該是微不足道的,但我運行到兩個地方,R不會返回相當於我使用apply with factor和使用apply與table時所期望的值。找到R中每個列的每個因子的編號

考慮這樣的示例數據:

mat <- matrix(sample(1:10,90,replace=TRUE),ncol=10,nrow=9) 
mat.levels <- as.character(unique(as.vector(mat))) 
mat.factor <- as.data.frame(apply(mat,2,as.character)) 

我的第一個步驟是relevel每一列,使得因子水平是相同的。起初我想:

apply(mat.factor,2,factor,levels=mat.levels) 
#But the data structure is all wrong, I don't appear to have a factor anymore! 
str(apply(mat.factor,2,factor,levels=mat.levels)) 

所以我使用一個循環,而不是蠻力迫使它...

for (i in 1:ncol(mat.factor)) { 
     levels(mat.factor[,i]) <- mat.levels 
    } 

然後我跑進與應用的另一個問題。我認爲現在我已經設置了因子水平,如果我缺少列中的給定因子,那麼表函數應該爲該因子水平返回0的計數。但是,當我使用應用程序時,它看起來像零點數的因素水平被剔除了!

apply(mat.factor,2,table)$V10 
str(apply(mat.factor,2,table)$V10) 
#But running table just on that one column yields the expected result! 
table(mat.factor[,10]) 
str(table(mat.factor[,10])) 

有人會解釋這兩種情況下發生了什麼嗎?我錯誤地理解了什麼?

回答

3

閱讀?apply的詳細信息部分中的第一句,然後運行as.matrix(mat.factor)以查看問題。數據幀使用lapply,而不是apply

下面是一個例子:

mat.factor <- as.data.frame(lapply(mat.factor,factor,levels = mat.levels)) 
lapply(mat.factor,table) 
+0

哎呀,這是非常明顯。我像數據框架一樣被拖入矩陣中,並忘記它是一種列表。 – russellpierce

+1

@drknexus你有很多公司犯了這個錯誤。 :) – joran