我正在尝试编写代码,允许我在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]))
有人会解释这两种情况的情况吗?我误解了什么?
答案 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)