在R中查找每列的每个因子的数量

时间:2012-12-27 16:41:47

标签: r matrix apply r-factor

我正在尝试编写代码,允许我在R中找到每列的每个因子的数量,并且我希望每列中的因子级别相同。我认为这应该是微不足道的,但我遇到了两个地方,当使用apply with factor并使用apply with 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))

我的第一步是重新调整每一列,使因子水平相同。起初我试过了:

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时,看起来像零数量的因子级别被淘汰了!

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]))

有人会解释这两种情况的情况吗?我误解了什么?

1 个答案:

答案 0 :(得分:3)

阅读?apply的详细信息部分中的第一句话,然后运行as.matrix(mat.factor)以查看问题。使用lapply表示数据框,而不是apply

以下是一个例子:

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