Нахождение количества каждого фактора в столбце в R

Я пытаюсь написать код, который позволит мне найти количество каждого фактора для каждого столбца в R с ограничением, что я хочу, чтобы уровни факторов были одинаковыми в каждом столбце. Я думал, что это должно быть тривиально, но я сталкиваюсь с двумя ситуациями, когда R не возвращает то значение, которое я ожидаю при использовании apply с фактором и использовании apply с таблицей.

Рассмотрим этот пример данных:

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

Может кто-нибудь объяснить, что происходит в этих двух случаях? Что я неправильно понимаю?


person russellpierce    schedule 27.12.2012    source источник


Ответы (1)


Прочтите первое предложение в разделе «Подробности» ?apply, а затем запустите as.matrix(mat.factor), чтобы увидеть проблему. Используйте lapply для фреймов данных, а не apply.

Вот пример:

mat.factor <- as.data.frame(lapply(mat.factor,factor,levels = mat.levels))
lapply(mat.factor,table)
person joran    schedule 27.12.2012
comment
Ой, это до боли очевидно. Я погрузился в матрицу, подобную структуре data.frame, и забыл, что это тип списка. - person russellpierce; 27.12.2012
comment
@drknexus У вас большая компания, совершившая эту ошибку. :) - person joran; 27.12.2012